global variant of csname…endcsnameWhat exactly do csname and endcsname do?global confusionWhat causes the...

Why do some academic journals requires a separate "summary" paragraph in addition to an abstract?

Chord with lyrics - What does it mean if there is an empty space instead of a Chord?

Unbiased estimator of exponential of measure of a set?

Are there categories whose internal hom is somewhat 'exotic'?

Convert HTML color to OLE

Are required indicators necessary for radio buttons?

What can I do to keep a threaded bolt from falling out of it’s slot

Can a Beast Master ranger choose a swarm as an animal companion?

Chess software to analyze games

Is there a commercial liquid with refractive index greater than n=2?

Why don't politicians push for fossil fuel reduction by pointing out their scarcity?

Are illustrations in novels frowned upon?

Earliest evidence of objects intended for future archaeologists?

!I!n!s!e!r!t! !n!b!e!t!w!e!e!n!

What happens when two creatures actually share the same turn?

How to create a summation symbol with a vertical bar?

My two team members in a remote location don't get along with each other; how can I improve working relations?

How did Apollo 15's depressurization work?

How to think about joining a company whose business I do not understand?

How to decide whether an eshop is safe or compromised

How do you call it when two celestial bodies come as close to each other as they will in their current orbits?

How to detect a failed AES256 decryption programmatically?

Does C++20 mandate source code being stored in files?

I think my coworker went through my notebook and took my project ideas



global variant of csname…endcsname


What exactly do csname and endcsname do?global confusionWhat causes the difference appearance by the useages of two “csname…endcsname”?Defining parametric commands - issue with nested csnameExpansion rules for csname/endcsname inside edefNon-alphabet letter in csname …endcsnameUse let with csnameWhat is the difference between somecmd and csname somecmdendcsname?Isn't csname fooendcsname = foo?






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







11















Please consider the following minimal example:



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
deffoobar{expandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}


The resulting log file contains an entry {retaining testB=macro:->blubb}, but no corresponding entry for testA. As far as I understand TeX, this means that csname...endcsname defines the macro testA as relax locally, which I immediately after reassign globally as "blubb", which, in turn, adds an retaining-entry on my save_stack.



In my real-world application, i need to be able to define a potentially infinite number of individually named macros using csname-constructions, which now has lead to a stack overflow because of this. (well, maybe not infinite, but definitely more than 80000s…)



My question now is: Is there a way to initialize a csname…endcsname-construct globally to avoid them being stacked on the save-stack? Or some kind of workaround which keeps my save-stack clean?










share|improve this question

























  • luatex a possibility?

    – David Carlisle
    Aug 16 at 16:27











  • why are you defining so many global variables in a local context?

    – Ulrike Fischer
    Aug 16 at 16:50











  • xmltex… in a nutshell i'm reading the information from style- and class attributes in html tables and store that information in control sequences to render them later after some calculations and processing. For each cell. Individually.... And we have books that consist only of tables… And no, luatex is not an option: too slow for professional typesetting.

    – Lupino
    Aug 16 at 16:56











  • I still don't see why this should means that you need groups. Also it sounds as if you would gain a lot by using lua to do the processing.

    – Ulrike Fischer
    Aug 16 at 17:12











  • @UlrikeFischer As I said, lua(la)tex is not an option. Unfortunately… (and neither is xelatex, pdflatex, and anything other than latex with dvi output and xmltex). Besides, everything works perfectly well within tex: calculating, processing, and rendering. It is just that the "feature" described in the OP prevents scaling: If the tables are too long, TeX bites the dust with a "memory exceeded"-error.

    – Lupino
    Aug 16 at 17:23


















11















Please consider the following minimal example:



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
deffoobar{expandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}


The resulting log file contains an entry {retaining testB=macro:->blubb}, but no corresponding entry for testA. As far as I understand TeX, this means that csname...endcsname defines the macro testA as relax locally, which I immediately after reassign globally as "blubb", which, in turn, adds an retaining-entry on my save_stack.



In my real-world application, i need to be able to define a potentially infinite number of individually named macros using csname-constructions, which now has lead to a stack overflow because of this. (well, maybe not infinite, but definitely more than 80000s…)



My question now is: Is there a way to initialize a csname…endcsname-construct globally to avoid them being stacked on the save-stack? Or some kind of workaround which keeps my save-stack clean?










share|improve this question

























  • luatex a possibility?

    – David Carlisle
    Aug 16 at 16:27











  • why are you defining so many global variables in a local context?

    – Ulrike Fischer
    Aug 16 at 16:50











  • xmltex… in a nutshell i'm reading the information from style- and class attributes in html tables and store that information in control sequences to render them later after some calculations and processing. For each cell. Individually.... And we have books that consist only of tables… And no, luatex is not an option: too slow for professional typesetting.

    – Lupino
    Aug 16 at 16:56











  • I still don't see why this should means that you need groups. Also it sounds as if you would gain a lot by using lua to do the processing.

    – Ulrike Fischer
    Aug 16 at 17:12











  • @UlrikeFischer As I said, lua(la)tex is not an option. Unfortunately… (and neither is xelatex, pdflatex, and anything other than latex with dvi output and xmltex). Besides, everything works perfectly well within tex: calculating, processing, and rendering. It is just that the "feature" described in the OP prevents scaling: If the tables are too long, TeX bites the dust with a "memory exceeded"-error.

    – Lupino
    Aug 16 at 17:23














11












11








11








Please consider the following minimal example:



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
deffoobar{expandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}


The resulting log file contains an entry {retaining testB=macro:->blubb}, but no corresponding entry for testA. As far as I understand TeX, this means that csname...endcsname defines the macro testA as relax locally, which I immediately after reassign globally as "blubb", which, in turn, adds an retaining-entry on my save_stack.



In my real-world application, i need to be able to define a potentially infinite number of individually named macros using csname-constructions, which now has lead to a stack overflow because of this. (well, maybe not infinite, but definitely more than 80000s…)



My question now is: Is there a way to initialize a csname…endcsname-construct globally to avoid them being stacked on the save-stack? Or some kind of workaround which keeps my save-stack clean?










share|improve this question














Please consider the following minimal example:



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
deffoobar{expandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}


The resulting log file contains an entry {retaining testB=macro:->blubb}, but no corresponding entry for testA. As far as I understand TeX, this means that csname...endcsname defines the macro testA as relax locally, which I immediately after reassign globally as "blubb", which, in turn, adds an retaining-entry on my save_stack.



In my real-world application, i need to be able to define a potentially infinite number of individually named macros using csname-constructions, which now has lead to a stack overflow because of this. (well, maybe not infinite, but definitely more than 80000s…)



My question now is: Is there a way to initialize a csname…endcsname-construct globally to avoid them being stacked on the save-stack? Or some kind of workaround which keeps my save-stack clean?







tex-core grouping csname






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Aug 16 at 16:14









LupinoLupino

1,3057 silver badges12 bronze badges




1,3057 silver badges12 bronze badges
















  • luatex a possibility?

    – David Carlisle
    Aug 16 at 16:27











  • why are you defining so many global variables in a local context?

    – Ulrike Fischer
    Aug 16 at 16:50











  • xmltex… in a nutshell i'm reading the information from style- and class attributes in html tables and store that information in control sequences to render them later after some calculations and processing. For each cell. Individually.... And we have books that consist only of tables… And no, luatex is not an option: too slow for professional typesetting.

    – Lupino
    Aug 16 at 16:56











  • I still don't see why this should means that you need groups. Also it sounds as if you would gain a lot by using lua to do the processing.

    – Ulrike Fischer
    Aug 16 at 17:12











  • @UlrikeFischer As I said, lua(la)tex is not an option. Unfortunately… (and neither is xelatex, pdflatex, and anything other than latex with dvi output and xmltex). Besides, everything works perfectly well within tex: calculating, processing, and rendering. It is just that the "feature" described in the OP prevents scaling: If the tables are too long, TeX bites the dust with a "memory exceeded"-error.

    – Lupino
    Aug 16 at 17:23



















  • luatex a possibility?

    – David Carlisle
    Aug 16 at 16:27











  • why are you defining so many global variables in a local context?

    – Ulrike Fischer
    Aug 16 at 16:50











  • xmltex… in a nutshell i'm reading the information from style- and class attributes in html tables and store that information in control sequences to render them later after some calculations and processing. For each cell. Individually.... And we have books that consist only of tables… And no, luatex is not an option: too slow for professional typesetting.

    – Lupino
    Aug 16 at 16:56











  • I still don't see why this should means that you need groups. Also it sounds as if you would gain a lot by using lua to do the processing.

    – Ulrike Fischer
    Aug 16 at 17:12











  • @UlrikeFischer As I said, lua(la)tex is not an option. Unfortunately… (and neither is xelatex, pdflatex, and anything other than latex with dvi output and xmltex). Besides, everything works perfectly well within tex: calculating, processing, and rendering. It is just that the "feature" described in the OP prevents scaling: If the tables are too long, TeX bites the dust with a "memory exceeded"-error.

    – Lupino
    Aug 16 at 17:23

















luatex a possibility?

– David Carlisle
Aug 16 at 16:27





luatex a possibility?

– David Carlisle
Aug 16 at 16:27













why are you defining so many global variables in a local context?

– Ulrike Fischer
Aug 16 at 16:50





why are you defining so many global variables in a local context?

– Ulrike Fischer
Aug 16 at 16:50













xmltex… in a nutshell i'm reading the information from style- and class attributes in html tables and store that information in control sequences to render them later after some calculations and processing. For each cell. Individually.... And we have books that consist only of tables… And no, luatex is not an option: too slow for professional typesetting.

– Lupino
Aug 16 at 16:56





xmltex… in a nutshell i'm reading the information from style- and class attributes in html tables and store that information in control sequences to render them later after some calculations and processing. For each cell. Individually.... And we have books that consist only of tables… And no, luatex is not an option: too slow for professional typesetting.

– Lupino
Aug 16 at 16:56













I still don't see why this should means that you need groups. Also it sounds as if you would gain a lot by using lua to do the processing.

– Ulrike Fischer
Aug 16 at 17:12





I still don't see why this should means that you need groups. Also it sounds as if you would gain a lot by using lua to do the processing.

– Ulrike Fischer
Aug 16 at 17:12













@UlrikeFischer As I said, lua(la)tex is not an option. Unfortunately… (and neither is xelatex, pdflatex, and anything other than latex with dvi output and xmltex). Besides, everything works perfectly well within tex: calculating, processing, and rendering. It is just that the "feature" described in the OP prevents scaling: If the tables are too long, TeX bites the dust with a "memory exceeded"-error.

– Lupino
Aug 16 at 17:23





@UlrikeFischer As I said, lua(la)tex is not an option. Unfortunately… (and neither is xelatex, pdflatex, and anything other than latex with dvi output and xmltex). Besides, everything works perfectly well within tex: calculating, processing, and rendering. It is just that the "feature" described in the OP prevents scaling: If the tables are too long, TeX bites the dust with a "memory exceeded"-error.

– Lupino
Aug 16 at 17:23










2 Answers
2






active

oldest

votes


















16














Instead of making the csname assignment global, you can make it even more local:



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
deffoobar{begingroupexpandafterendgroupexpandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}


Now the expandafter is executed in a group, so the csname defined testB to relax in a group which ends before gdef starts. So testB is undefined when the global definition occurs which should avoid the retaining entry.






share|improve this answer


























  • I dont quite understand why this is working, but it works. Thanks.

    – Lupino
    Aug 16 at 17:31











  • Masterful! +1!!

    – Steven B. Segletes
    Aug 16 at 17:33






  • 1





    This is absolutely genius! This allows to have a fully-expandable ifcsname test without e-TeX using begingroupexpandafterendgroupexpandafterifxcsname fooendcsnameundefined. Bounty will be offered when eligible.

    – Henri Menke
    2 days ago








  • 1





    @HenriMenke Heiko uses this quite a bit in his packages too, but it's not really fully expandable, it leaves begingroupendgroup before the test (so you can't use it at start of a table cell without preventing omit etc)

    – David Carlisle
    2 days ago



















8














I don't know squat about (La)TeX stacks (other than stackengine, LOL), but if the goal is to avoid having the csname inside a def...



Expand the csname before executing the outer def.



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}





share|improve this answer


























  • good trick, but I expect that's cheating, as the OP would probably need 80000 top level instances of that in the stated use case. (+1anyway:-)

    – David Carlisle
    Aug 16 at 16:27











  • Gaining that extra-level of depth (height?), actually helps for most of my cases, but not for all :/ Am I assuming correctly that i would need one level of expandafter for each "layer" of embeded macro? That woudl be bad, because foo could itself be embedded in another macro, or not. And since I'm using (forced to use) xmltex, i probably never will reach "real" top-level with that method… Thanks anyways for the quick reply.

    – Lupino
    Aug 16 at 16:51











  • @Lupino As I said, I don't profess to understand what is under TeX's hood, such as stacks. However, if the csname is the issue, you would not need additional layers of expandafter...only on the layer employing the csname. If, on the other hand, the issue is one of def vs. gdef, then I am not sure. But if David thinks I am cheating, I probably am.

    – Steven B. Segletes
    Aug 16 at 17:03











  • @Lupino The key would be if you can think of a problem case that uses no csnames...

    – Steven B. Segletes
    Aug 16 at 17:05






  • 1





    @StevenB.Segletes If i use defbaz{expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}} and later {bazfoo} i would need to extend the expandafters outwards to defbaz to raise the csname to the same level as my call to testB, otherwise i have the same problem as before…

    – Lupino
    Aug 16 at 17:16
















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%2f504501%2fglobal-variant-of-csname-endcsname%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









16














Instead of making the csname assignment global, you can make it even more local:



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
deffoobar{begingroupexpandafterendgroupexpandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}


Now the expandafter is executed in a group, so the csname defined testB to relax in a group which ends before gdef starts. So testB is undefined when the global definition occurs which should avoid the retaining entry.






share|improve this answer


























  • I dont quite understand why this is working, but it works. Thanks.

    – Lupino
    Aug 16 at 17:31











  • Masterful! +1!!

    – Steven B. Segletes
    Aug 16 at 17:33






  • 1





    This is absolutely genius! This allows to have a fully-expandable ifcsname test without e-TeX using begingroupexpandafterendgroupexpandafterifxcsname fooendcsnameundefined. Bounty will be offered when eligible.

    – Henri Menke
    2 days ago








  • 1





    @HenriMenke Heiko uses this quite a bit in his packages too, but it's not really fully expandable, it leaves begingroupendgroup before the test (so you can't use it at start of a table cell without preventing omit etc)

    – David Carlisle
    2 days ago
















16














Instead of making the csname assignment global, you can make it even more local:



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
deffoobar{begingroupexpandafterendgroupexpandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}


Now the expandafter is executed in a group, so the csname defined testB to relax in a group which ends before gdef starts. So testB is undefined when the global definition occurs which should avoid the retaining entry.






share|improve this answer


























  • I dont quite understand why this is working, but it works. Thanks.

    – Lupino
    Aug 16 at 17:31











  • Masterful! +1!!

    – Steven B. Segletes
    Aug 16 at 17:33






  • 1





    This is absolutely genius! This allows to have a fully-expandable ifcsname test without e-TeX using begingroupexpandafterendgroupexpandafterifxcsname fooendcsnameundefined. Bounty will be offered when eligible.

    – Henri Menke
    2 days ago








  • 1





    @HenriMenke Heiko uses this quite a bit in his packages too, but it's not really fully expandable, it leaves begingroupendgroup before the test (so you can't use it at start of a table cell without preventing omit etc)

    – David Carlisle
    2 days ago














16












16








16







Instead of making the csname assignment global, you can make it even more local:



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
deffoobar{begingroupexpandafterendgroupexpandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}


Now the expandafter is executed in a group, so the csname defined testB to relax in a group which ends before gdef starts. So testB is undefined when the global definition occurs which should avoid the retaining entry.






share|improve this answer













Instead of making the csname assignment global, you can make it even more local:



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
deffoobar{begingroupexpandafterendgroupexpandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}


Now the expandafter is executed in a group, so the csname defined testB to relax in a group which ends before gdef starts. So testB is undefined when the global definition occurs which should avoid the retaining entry.







share|improve this answer












share|improve this answer



share|improve this answer










answered Aug 16 at 17:12









Marcel KrügerMarcel Krüger

15.3k1 gold badge18 silver badges38 bronze badges




15.3k1 gold badge18 silver badges38 bronze badges
















  • I dont quite understand why this is working, but it works. Thanks.

    – Lupino
    Aug 16 at 17:31











  • Masterful! +1!!

    – Steven B. Segletes
    Aug 16 at 17:33






  • 1





    This is absolutely genius! This allows to have a fully-expandable ifcsname test without e-TeX using begingroupexpandafterendgroupexpandafterifxcsname fooendcsnameundefined. Bounty will be offered when eligible.

    – Henri Menke
    2 days ago








  • 1





    @HenriMenke Heiko uses this quite a bit in his packages too, but it's not really fully expandable, it leaves begingroupendgroup before the test (so you can't use it at start of a table cell without preventing omit etc)

    – David Carlisle
    2 days ago



















  • I dont quite understand why this is working, but it works. Thanks.

    – Lupino
    Aug 16 at 17:31











  • Masterful! +1!!

    – Steven B. Segletes
    Aug 16 at 17:33






  • 1





    This is absolutely genius! This allows to have a fully-expandable ifcsname test without e-TeX using begingroupexpandafterendgroupexpandafterifxcsname fooendcsnameundefined. Bounty will be offered when eligible.

    – Henri Menke
    2 days ago








  • 1





    @HenriMenke Heiko uses this quite a bit in his packages too, but it's not really fully expandable, it leaves begingroupendgroup before the test (so you can't use it at start of a table cell without preventing omit etc)

    – David Carlisle
    2 days ago

















I dont quite understand why this is working, but it works. Thanks.

– Lupino
Aug 16 at 17:31





I dont quite understand why this is working, but it works. Thanks.

– Lupino
Aug 16 at 17:31













Masterful! +1!!

– Steven B. Segletes
Aug 16 at 17:33





Masterful! +1!!

– Steven B. Segletes
Aug 16 at 17:33




1




1





This is absolutely genius! This allows to have a fully-expandable ifcsname test without e-TeX using begingroupexpandafterendgroupexpandafterifxcsname fooendcsnameundefined. Bounty will be offered when eligible.

– Henri Menke
2 days ago







This is absolutely genius! This allows to have a fully-expandable ifcsname test without e-TeX using begingroupexpandafterendgroupexpandafterifxcsname fooendcsnameundefined. Bounty will be offered when eligible.

– Henri Menke
2 days ago






1




1





@HenriMenke Heiko uses this quite a bit in his packages too, but it's not really fully expandable, it leaves begingroupendgroup before the test (so you can't use it at start of a table cell without preventing omit etc)

– David Carlisle
2 days ago





@HenriMenke Heiko uses this quite a bit in his packages too, but it's not really fully expandable, it leaves begingroupendgroup before the test (so you can't use it at start of a table cell without preventing omit etc)

– David Carlisle
2 days ago













8














I don't know squat about (La)TeX stacks (other than stackengine, LOL), but if the goal is to avoid having the csname inside a def...



Expand the csname before executing the outer def.



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}





share|improve this answer


























  • good trick, but I expect that's cheating, as the OP would probably need 80000 top level instances of that in the stated use case. (+1anyway:-)

    – David Carlisle
    Aug 16 at 16:27











  • Gaining that extra-level of depth (height?), actually helps for most of my cases, but not for all :/ Am I assuming correctly that i would need one level of expandafter for each "layer" of embeded macro? That woudl be bad, because foo could itself be embedded in another macro, or not. And since I'm using (forced to use) xmltex, i probably never will reach "real" top-level with that method… Thanks anyways for the quick reply.

    – Lupino
    Aug 16 at 16:51











  • @Lupino As I said, I don't profess to understand what is under TeX's hood, such as stacks. However, if the csname is the issue, you would not need additional layers of expandafter...only on the layer employing the csname. If, on the other hand, the issue is one of def vs. gdef, then I am not sure. But if David thinks I am cheating, I probably am.

    – Steven B. Segletes
    Aug 16 at 17:03











  • @Lupino The key would be if you can think of a problem case that uses no csnames...

    – Steven B. Segletes
    Aug 16 at 17:05






  • 1





    @StevenB.Segletes If i use defbaz{expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}} and later {bazfoo} i would need to extend the expandafters outwards to defbaz to raise the csname to the same level as my call to testB, otherwise i have the same problem as before…

    – Lupino
    Aug 16 at 17:16


















8














I don't know squat about (La)TeX stacks (other than stackengine, LOL), but if the goal is to avoid having the csname inside a def...



Expand the csname before executing the outer def.



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}





share|improve this answer


























  • good trick, but I expect that's cheating, as the OP would probably need 80000 top level instances of that in the stated use case. (+1anyway:-)

    – David Carlisle
    Aug 16 at 16:27











  • Gaining that extra-level of depth (height?), actually helps for most of my cases, but not for all :/ Am I assuming correctly that i would need one level of expandafter for each "layer" of embeded macro? That woudl be bad, because foo could itself be embedded in another macro, or not. And since I'm using (forced to use) xmltex, i probably never will reach "real" top-level with that method… Thanks anyways for the quick reply.

    – Lupino
    Aug 16 at 16:51











  • @Lupino As I said, I don't profess to understand what is under TeX's hood, such as stacks. However, if the csname is the issue, you would not need additional layers of expandafter...only on the layer employing the csname. If, on the other hand, the issue is one of def vs. gdef, then I am not sure. But if David thinks I am cheating, I probably am.

    – Steven B. Segletes
    Aug 16 at 17:03











  • @Lupino The key would be if you can think of a problem case that uses no csnames...

    – Steven B. Segletes
    Aug 16 at 17:05






  • 1





    @StevenB.Segletes If i use defbaz{expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}} and later {bazfoo} i would need to extend the expandafters outwards to defbaz to raise the csname to the same level as my call to testB, otherwise i have the same problem as before…

    – Lupino
    Aug 16 at 17:16
















8












8








8







I don't know squat about (La)TeX stacks (other than stackengine, LOL), but if the goal is to avoid having the csname inside a def...



Expand the csname before executing the outer def.



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}





share|improve this answer













I don't know squat about (La)TeX stacks (other than stackengine, LOL), but if the goal is to avoid having the csname inside a def...



Expand the csname before executing the outer def.



documentclass{article}
tracingrestores=1

deffoo{barfoobar}
defbar{gdeftestA{blabb}}
expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}

begin{document}
{foo}

testA
testB

end{document}






share|improve this answer












share|improve this answer



share|improve this answer










answered Aug 16 at 16:22









Steven B. SegletesSteven B. Segletes

168k9 gold badges214 silver badges436 bronze badges




168k9 gold badges214 silver badges436 bronze badges
















  • good trick, but I expect that's cheating, as the OP would probably need 80000 top level instances of that in the stated use case. (+1anyway:-)

    – David Carlisle
    Aug 16 at 16:27











  • Gaining that extra-level of depth (height?), actually helps for most of my cases, but not for all :/ Am I assuming correctly that i would need one level of expandafter for each "layer" of embeded macro? That woudl be bad, because foo could itself be embedded in another macro, or not. And since I'm using (forced to use) xmltex, i probably never will reach "real" top-level with that method… Thanks anyways for the quick reply.

    – Lupino
    Aug 16 at 16:51











  • @Lupino As I said, I don't profess to understand what is under TeX's hood, such as stacks. However, if the csname is the issue, you would not need additional layers of expandafter...only on the layer employing the csname. If, on the other hand, the issue is one of def vs. gdef, then I am not sure. But if David thinks I am cheating, I probably am.

    – Steven B. Segletes
    Aug 16 at 17:03











  • @Lupino The key would be if you can think of a problem case that uses no csnames...

    – Steven B. Segletes
    Aug 16 at 17:05






  • 1





    @StevenB.Segletes If i use defbaz{expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}} and later {bazfoo} i would need to extend the expandafters outwards to defbaz to raise the csname to the same level as my call to testB, otherwise i have the same problem as before…

    – Lupino
    Aug 16 at 17:16





















  • good trick, but I expect that's cheating, as the OP would probably need 80000 top level instances of that in the stated use case. (+1anyway:-)

    – David Carlisle
    Aug 16 at 16:27











  • Gaining that extra-level of depth (height?), actually helps for most of my cases, but not for all :/ Am I assuming correctly that i would need one level of expandafter for each "layer" of embeded macro? That woudl be bad, because foo could itself be embedded in another macro, or not. And since I'm using (forced to use) xmltex, i probably never will reach "real" top-level with that method… Thanks anyways for the quick reply.

    – Lupino
    Aug 16 at 16:51











  • @Lupino As I said, I don't profess to understand what is under TeX's hood, such as stacks. However, if the csname is the issue, you would not need additional layers of expandafter...only on the layer employing the csname. If, on the other hand, the issue is one of def vs. gdef, then I am not sure. But if David thinks I am cheating, I probably am.

    – Steven B. Segletes
    Aug 16 at 17:03











  • @Lupino The key would be if you can think of a problem case that uses no csnames...

    – Steven B. Segletes
    Aug 16 at 17:05






  • 1





    @StevenB.Segletes If i use defbaz{expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}} and later {bazfoo} i would need to extend the expandafters outwards to defbaz to raise the csname to the same level as my call to testB, otherwise i have the same problem as before…

    – Lupino
    Aug 16 at 17:16



















good trick, but I expect that's cheating, as the OP would probably need 80000 top level instances of that in the stated use case. (+1anyway:-)

– David Carlisle
Aug 16 at 16:27





good trick, but I expect that's cheating, as the OP would probably need 80000 top level instances of that in the stated use case. (+1anyway:-)

– David Carlisle
Aug 16 at 16:27













Gaining that extra-level of depth (height?), actually helps for most of my cases, but not for all :/ Am I assuming correctly that i would need one level of expandafter for each "layer" of embeded macro? That woudl be bad, because foo could itself be embedded in another macro, or not. And since I'm using (forced to use) xmltex, i probably never will reach "real" top-level with that method… Thanks anyways for the quick reply.

– Lupino
Aug 16 at 16:51





Gaining that extra-level of depth (height?), actually helps for most of my cases, but not for all :/ Am I assuming correctly that i would need one level of expandafter for each "layer" of embeded macro? That woudl be bad, because foo could itself be embedded in another macro, or not. And since I'm using (forced to use) xmltex, i probably never will reach "real" top-level with that method… Thanks anyways for the quick reply.

– Lupino
Aug 16 at 16:51













@Lupino As I said, I don't profess to understand what is under TeX's hood, such as stacks. However, if the csname is the issue, you would not need additional layers of expandafter...only on the layer employing the csname. If, on the other hand, the issue is one of def vs. gdef, then I am not sure. But if David thinks I am cheating, I probably am.

– Steven B. Segletes
Aug 16 at 17:03





@Lupino As I said, I don't profess to understand what is under TeX's hood, such as stacks. However, if the csname is the issue, you would not need additional layers of expandafter...only on the layer employing the csname. If, on the other hand, the issue is one of def vs. gdef, then I am not sure. But if David thinks I am cheating, I probably am.

– Steven B. Segletes
Aug 16 at 17:03













@Lupino The key would be if you can think of a problem case that uses no csnames...

– Steven B. Segletes
Aug 16 at 17:05





@Lupino The key would be if you can think of a problem case that uses no csnames...

– Steven B. Segletes
Aug 16 at 17:05




1




1





@StevenB.Segletes If i use defbaz{expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}} and later {bazfoo} i would need to extend the expandafters outwards to defbaz to raise the csname to the same level as my call to testB, otherwise i have the same problem as before…

– Lupino
Aug 16 at 17:16







@StevenB.Segletes If i use defbaz{expandafterdefexpandafterfoobarexpandafter{expandaftergdefcsname testBendcsname{blubb}}} and later {bazfoo} i would need to extend the expandafters outwards to defbaz to raise the csname to the same level as my call to testB, otherwise i have the same problem as before…

– Lupino
Aug 16 at 17:16




















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%2f504501%2fglobal-variant-of-csname-endcsname%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

Taj Mahal Inhaltsverzeichnis Aufbau | Geschichte | 350-Jahr-Feier | Heutige Bedeutung | Siehe auch |...

Baia Sprie Cuprins Etimologie | Istorie | Demografie | Politică și administrație | Arii naturale...

Nicolae Petrescu-Găină Cuprins Biografie | Opera | In memoriam | Varia | Controverse, incertitudini...