What exactly do csname and endcsname do?











up vote
143
down vote

favorite
51












What exactly do csname and endcsname do? What are their job?

I have glanced at the Texbook and some other books, but none of them was clear enough to me.

Can anyone please give a simple example to clarify this issue?










share|improve this question




















  • 8




    See TeX by Topic, section 11.6
    – Martin Schröder
    Dec 26 '11 at 22:26















up vote
143
down vote

favorite
51












What exactly do csname and endcsname do? What are their job?

I have glanced at the Texbook and some other books, but none of them was clear enough to me.

Can anyone please give a simple example to clarify this issue?










share|improve this question




















  • 8




    See TeX by Topic, section 11.6
    – Martin Schröder
    Dec 26 '11 at 22:26













up vote
143
down vote

favorite
51









up vote
143
down vote

favorite
51






51





What exactly do csname and endcsname do? What are their job?

I have glanced at the Texbook and some other books, but none of them was clear enough to me.

Can anyone please give a simple example to clarify this issue?










share|improve this question















What exactly do csname and endcsname do? What are their job?

I have glanced at the Texbook and some other books, but none of them was clear enough to me.

Can anyone please give a simple example to clarify this issue?







macros tex-core






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Dec 26 '11 at 23:19









lockstep

189k52585719




189k52585719










asked Dec 26 '11 at 22:04









Vahid Damanafshan

3,15332652




3,15332652








  • 8




    See TeX by Topic, section 11.6
    – Martin Schröder
    Dec 26 '11 at 22:26














  • 8




    See TeX by Topic, section 11.6
    – Martin Schröder
    Dec 26 '11 at 22:26








8




8




See TeX by Topic, section 11.6
– Martin Schröder
Dec 26 '11 at 22:26




See TeX by Topic, section 11.6
– Martin Schröder
Dec 26 '11 at 22:26










6 Answers
6






active

oldest

votes

















up vote
133
down vote



accepted










Normally, control sequence names are made only of letters or of one non-letter character.



A letter is, more precisely, a character having category code 11 at the moment the control sequence name is read. So, any character can become part of a control sequence name, provided we change its catcode before the definition and each usage.



With csname...endcsname we are freed from this limitation and every character can go inside them to form a control sequence name (of course, % is excluded because it disappears together what remains on the line before TeX is doing its work on characters).



However, this is not the main purpose of csname...endcsname. This construction is used to build commands from "variable parts". Think, for instance to LaTeX's newcounter: after newcounter{foo}, TeX knows thefoo that is built precisely in this way. Roughly, what LaTeX does is



newcommand{newcounter}[1]{%
expandafternewcountcsname c@#1endcsname
expandafterdefcsname the#1endcsname{arabic{#1}}%
}


so that newcounter{foo} does the right job. It's more complicated than this, of course, but the main things are here; newcount is the low-level command to allocate a counter. The expandafter is just to build the control sequence before newcount and def see the token.



Inside csname...endcsname, category codes don't matter (with one main exception: active characters will be expanded if not preceded by string, see final note). LaTeX exploits this in order to build control sequence names that users won't be able to access (easily). For example, the control sequence to choose the default ten point font is OT1/cmr/m/n/10, which can be easily split internally (by the "reverse" operation that is string) and is not available to the casual user.



Another important use is in environments: when you say newenvironment{foo}, LaTeX really defines foo and endfoo. Upon finding begin{foo}, LaTeX does some bookkeeping and then executes csname fooendcsname (that's why one can say also newenvironment{foo*}); similarly, at end{foo} LaTeX executes csname endfooendcsname and after this it does some bookkeeping again.



Other uses: label{foo} will define control sequences based on foo via csname...endcsname that can be used by ref.



When one says csname fooendcsname, LaTeX will look whether foo is defined; if not, it will execute relax and from then on (respecting grouping), foo will be interpreted as relax. An interesting usage for this feature is that one can say



chapter*{Introduction}
csname phantomsectionendcsname
addcontentsline{toc}{chapter}{Introduction}


and keep hyperref happy if it's loaded, while doing nothing if the package is not loaded.



It's possible to give many other interesting uses of this trick. But one should always keep in mind that TeX does complete expansion of what it finds in that context and that only characters must remain. So



csname abcrelax defendcsname


is forbidden. But, after defxyz{abc},



csname xyz defendcsname


will be legal and equivalent to saying csname abcdefendcsname or abcdef.



Final note



It's better to add something about category codes. An active character in csname...endcsname will be expanded, so to get a literal ~ one has to write string~. Comment (category 14), ignored (category 9) and invalid (category 15) characters will remain such. So



csname %endcsname


will give an error (Missing endcsname); in csname ^^@endcsname there will be no character and csname ^^?endcsname will raise an error.






share|improve this answer



















  • 2




    Braces don't need to be balanced. expandaftershowcsname{endcsname works fine with usual catcodes. Otherwise, very good response.
    – Bruno Le Floch
    Dec 27 '11 at 2:03






  • 1




    @BrunoLeFloch Right; they have to be balanced only if used to surround arguments to macros, of course.
    – egreg
    Dec 27 '11 at 10:37


















up vote
32
down vote













For reference, from the TeX Book (with slight formatting changes), Chapter 7: How TeX Reads What You Type (p 40):




...you can go from a list of character tokens to a control sequence by
saying csname<tokens>endcsname. The tokens that appear in this
construction between csname and endcsname may include other
control sequences, as long as those control sequences ultimately
expand into characters instead of TeX primitives; the final characters
can be of any category, not necessarily letters. For example, csname
TeXendcsname
is essentially the same as TeX; but
csnameTeXendcsname is illegal, because TeX expands into tokens
containing the kern primitive. Furthermore,
csnamestringTeXendcsname will produce the unusual control
sequence \TeX, i.e., the token <TeX>, which you can't ordinarily
write.




I have used this indirectly by using the label-ref system and defining labels based on counters:



newcounter{mycount}
%...
newcommand{mycmd}{%
stepcounter{mycount}%
label{abcthemycount}%
%...
}


This creates a "successive label abc1, abc2, ... for every call to mycmd, in order to avoid creating multiply defined labels with the same name. Indirectly, label{abcthemycount} calls @namedef{r@abcthemycount}, which calls



expandafterdefcsname r@abcthemycountendcsname


thereby expanding r@abcthemycount to r@abc1 and defining r@abc1 for the first label, r@abc2 for the second label, etc. Yes, labels in LaTeX are actually control sequences prepended with r@ and is constructed using csname ... endcsname which then allows numerals.






share|improve this answer




























    up vote
    23
    down vote













    csname/endcsname allows you to build commands whose names contains 1. non-letters (e.g. dots or colons or numbers) and - more importantly - 2. commands which are expanded when you define or use the command. Both is useful if you want to construct a command name from various pieces of informations.



    As an example: The xskak-Package loops through the notation of a chess game and stores a lot of informations of every move in commands. Its code contains a lot of definition of this type:



    expandafterxdef
    csname Xskak.xskak@val@gameid.thec@move.WhiteToMove{w}{b}.pieceendcsname{%
    ....
    }


    where xskak@val@gameid is the id of the current game, thec@move gives the current move number, WhiteToMove{w}{b} gives w or b depending on which player currently moves. So in the 10th move of black in the game with id "mygame" this xdef defines a "command" Xskak.mygame.10.b.piece which contains the name of the piece which has been moved by black in the tenth move.






    share|improve this answer




























      up vote
      22
      down vote













      Suppose you want to define a command foo2. You cannot do this because 2 is not a letter. However, this construction works: csname foo2endcsname. Sometimes this is useful, e.g. when you need a series of commands, foo1, foo2, etc (another way is to use roman numerals). Another example, suppose you want to define a series of commands like endsection, endsubsection, etc. Then you can use a loop with expandafterdefcsname end#1csname...






      share|improve this answer





















      • Thanks for your example, but can you tell me what generally their job are? When and where do I need to use them?
        – Vahid Damanafshan
        Dec 26 '11 at 22:35






      • 4




        Well, @egreg beat me to it. Basically a TeX command is either (1) a sequence of letters starting from `, e.g. parskip, or (2) a special symbol optionally preceded by a backslash, e.g. @, and (3) any sequence of symbols between csname` and endcsname. So the job of these commands is to introduce a way to produce TeX commands. You do not need to use them unless you do TeX programming. In the latter case they are handy.
        – Boris
        Dec 26 '11 at 23:34




















      up vote
      18
      down vote













      Short answer: csname and endcsname are a "macro environment" whose contents, if they evaluate (after expanding macros) to "ordinary text", are converted into the name of a macro (or control sequence, hence "csname").





      Actually, it is a perhaps strange joke that by the rules of LaTeX macros, you can actually write begin{csname}...end{csname} and it will act as you expect, to a certain extent. For example:



      defmacro{text}
      defo{o}
      begin{csname}%
      macro
      end{csname}
      % Same as csname macro endcsname


      (when run with latex rather than tex) will produce the word "text" in the output. The % sign is there so that unnecessary spaces don't creep into the name of the macro we are constructing.






      share|improve this answer






























        up vote
        0
        down vote













        As a very beginner for this antique problem, I just provide a simple example that may tell future novice something about csname. Though I do not fully understand I have tried it and successfully solved one problem of mine.



        My problem was to test different effect of different font command, like:



        textit{textit} textbf{textbf} {bfseries bfseries} {small small}


        and I tried to create a new command newcommand{FontTest}[1]{#1 #1}, I had quite a struggle wondering how to turn the first #1 to a command. And after many trials I used csname and it worked, so it was:



        newcommand{FontTest}[1]{{ csname #1endcsname{#1}}}


        and I can freely test different type of font families and shapes like: FontTest{textit} FontTest{sffamily} etc.



        And its effect seems like turning a string into command I guess.





        share








        New contributor




        Pistachio Guoguo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.


















          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%2f39380%2fwhat-exactly-do-csname-and-endcsname-do%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          6 Answers
          6






          active

          oldest

          votes








          6 Answers
          6






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          133
          down vote



          accepted










          Normally, control sequence names are made only of letters or of one non-letter character.



          A letter is, more precisely, a character having category code 11 at the moment the control sequence name is read. So, any character can become part of a control sequence name, provided we change its catcode before the definition and each usage.



          With csname...endcsname we are freed from this limitation and every character can go inside them to form a control sequence name (of course, % is excluded because it disappears together what remains on the line before TeX is doing its work on characters).



          However, this is not the main purpose of csname...endcsname. This construction is used to build commands from "variable parts". Think, for instance to LaTeX's newcounter: after newcounter{foo}, TeX knows thefoo that is built precisely in this way. Roughly, what LaTeX does is



          newcommand{newcounter}[1]{%
          expandafternewcountcsname c@#1endcsname
          expandafterdefcsname the#1endcsname{arabic{#1}}%
          }


          so that newcounter{foo} does the right job. It's more complicated than this, of course, but the main things are here; newcount is the low-level command to allocate a counter. The expandafter is just to build the control sequence before newcount and def see the token.



          Inside csname...endcsname, category codes don't matter (with one main exception: active characters will be expanded if not preceded by string, see final note). LaTeX exploits this in order to build control sequence names that users won't be able to access (easily). For example, the control sequence to choose the default ten point font is OT1/cmr/m/n/10, which can be easily split internally (by the "reverse" operation that is string) and is not available to the casual user.



          Another important use is in environments: when you say newenvironment{foo}, LaTeX really defines foo and endfoo. Upon finding begin{foo}, LaTeX does some bookkeeping and then executes csname fooendcsname (that's why one can say also newenvironment{foo*}); similarly, at end{foo} LaTeX executes csname endfooendcsname and after this it does some bookkeeping again.



          Other uses: label{foo} will define control sequences based on foo via csname...endcsname that can be used by ref.



          When one says csname fooendcsname, LaTeX will look whether foo is defined; if not, it will execute relax and from then on (respecting grouping), foo will be interpreted as relax. An interesting usage for this feature is that one can say



          chapter*{Introduction}
          csname phantomsectionendcsname
          addcontentsline{toc}{chapter}{Introduction}


          and keep hyperref happy if it's loaded, while doing nothing if the package is not loaded.



          It's possible to give many other interesting uses of this trick. But one should always keep in mind that TeX does complete expansion of what it finds in that context and that only characters must remain. So



          csname abcrelax defendcsname


          is forbidden. But, after defxyz{abc},



          csname xyz defendcsname


          will be legal and equivalent to saying csname abcdefendcsname or abcdef.



          Final note



          It's better to add something about category codes. An active character in csname...endcsname will be expanded, so to get a literal ~ one has to write string~. Comment (category 14), ignored (category 9) and invalid (category 15) characters will remain such. So



          csname %endcsname


          will give an error (Missing endcsname); in csname ^^@endcsname there will be no character and csname ^^?endcsname will raise an error.






          share|improve this answer



















          • 2




            Braces don't need to be balanced. expandaftershowcsname{endcsname works fine with usual catcodes. Otherwise, very good response.
            – Bruno Le Floch
            Dec 27 '11 at 2:03






          • 1




            @BrunoLeFloch Right; they have to be balanced only if used to surround arguments to macros, of course.
            – egreg
            Dec 27 '11 at 10:37















          up vote
          133
          down vote



          accepted










          Normally, control sequence names are made only of letters or of one non-letter character.



          A letter is, more precisely, a character having category code 11 at the moment the control sequence name is read. So, any character can become part of a control sequence name, provided we change its catcode before the definition and each usage.



          With csname...endcsname we are freed from this limitation and every character can go inside them to form a control sequence name (of course, % is excluded because it disappears together what remains on the line before TeX is doing its work on characters).



          However, this is not the main purpose of csname...endcsname. This construction is used to build commands from "variable parts". Think, for instance to LaTeX's newcounter: after newcounter{foo}, TeX knows thefoo that is built precisely in this way. Roughly, what LaTeX does is



          newcommand{newcounter}[1]{%
          expandafternewcountcsname c@#1endcsname
          expandafterdefcsname the#1endcsname{arabic{#1}}%
          }


          so that newcounter{foo} does the right job. It's more complicated than this, of course, but the main things are here; newcount is the low-level command to allocate a counter. The expandafter is just to build the control sequence before newcount and def see the token.



          Inside csname...endcsname, category codes don't matter (with one main exception: active characters will be expanded if not preceded by string, see final note). LaTeX exploits this in order to build control sequence names that users won't be able to access (easily). For example, the control sequence to choose the default ten point font is OT1/cmr/m/n/10, which can be easily split internally (by the "reverse" operation that is string) and is not available to the casual user.



          Another important use is in environments: when you say newenvironment{foo}, LaTeX really defines foo and endfoo. Upon finding begin{foo}, LaTeX does some bookkeeping and then executes csname fooendcsname (that's why one can say also newenvironment{foo*}); similarly, at end{foo} LaTeX executes csname endfooendcsname and after this it does some bookkeeping again.



          Other uses: label{foo} will define control sequences based on foo via csname...endcsname that can be used by ref.



          When one says csname fooendcsname, LaTeX will look whether foo is defined; if not, it will execute relax and from then on (respecting grouping), foo will be interpreted as relax. An interesting usage for this feature is that one can say



          chapter*{Introduction}
          csname phantomsectionendcsname
          addcontentsline{toc}{chapter}{Introduction}


          and keep hyperref happy if it's loaded, while doing nothing if the package is not loaded.



          It's possible to give many other interesting uses of this trick. But one should always keep in mind that TeX does complete expansion of what it finds in that context and that only characters must remain. So



          csname abcrelax defendcsname


          is forbidden. But, after defxyz{abc},



          csname xyz defendcsname


          will be legal and equivalent to saying csname abcdefendcsname or abcdef.



          Final note



          It's better to add something about category codes. An active character in csname...endcsname will be expanded, so to get a literal ~ one has to write string~. Comment (category 14), ignored (category 9) and invalid (category 15) characters will remain such. So



          csname %endcsname


          will give an error (Missing endcsname); in csname ^^@endcsname there will be no character and csname ^^?endcsname will raise an error.






          share|improve this answer



















          • 2




            Braces don't need to be balanced. expandaftershowcsname{endcsname works fine with usual catcodes. Otherwise, very good response.
            – Bruno Le Floch
            Dec 27 '11 at 2:03






          • 1




            @BrunoLeFloch Right; they have to be balanced only if used to surround arguments to macros, of course.
            – egreg
            Dec 27 '11 at 10:37













          up vote
          133
          down vote



          accepted







          up vote
          133
          down vote



          accepted






          Normally, control sequence names are made only of letters or of one non-letter character.



          A letter is, more precisely, a character having category code 11 at the moment the control sequence name is read. So, any character can become part of a control sequence name, provided we change its catcode before the definition and each usage.



          With csname...endcsname we are freed from this limitation and every character can go inside them to form a control sequence name (of course, % is excluded because it disappears together what remains on the line before TeX is doing its work on characters).



          However, this is not the main purpose of csname...endcsname. This construction is used to build commands from "variable parts". Think, for instance to LaTeX's newcounter: after newcounter{foo}, TeX knows thefoo that is built precisely in this way. Roughly, what LaTeX does is



          newcommand{newcounter}[1]{%
          expandafternewcountcsname c@#1endcsname
          expandafterdefcsname the#1endcsname{arabic{#1}}%
          }


          so that newcounter{foo} does the right job. It's more complicated than this, of course, but the main things are here; newcount is the low-level command to allocate a counter. The expandafter is just to build the control sequence before newcount and def see the token.



          Inside csname...endcsname, category codes don't matter (with one main exception: active characters will be expanded if not preceded by string, see final note). LaTeX exploits this in order to build control sequence names that users won't be able to access (easily). For example, the control sequence to choose the default ten point font is OT1/cmr/m/n/10, which can be easily split internally (by the "reverse" operation that is string) and is not available to the casual user.



          Another important use is in environments: when you say newenvironment{foo}, LaTeX really defines foo and endfoo. Upon finding begin{foo}, LaTeX does some bookkeeping and then executes csname fooendcsname (that's why one can say also newenvironment{foo*}); similarly, at end{foo} LaTeX executes csname endfooendcsname and after this it does some bookkeeping again.



          Other uses: label{foo} will define control sequences based on foo via csname...endcsname that can be used by ref.



          When one says csname fooendcsname, LaTeX will look whether foo is defined; if not, it will execute relax and from then on (respecting grouping), foo will be interpreted as relax. An interesting usage for this feature is that one can say



          chapter*{Introduction}
          csname phantomsectionendcsname
          addcontentsline{toc}{chapter}{Introduction}


          and keep hyperref happy if it's loaded, while doing nothing if the package is not loaded.



          It's possible to give many other interesting uses of this trick. But one should always keep in mind that TeX does complete expansion of what it finds in that context and that only characters must remain. So



          csname abcrelax defendcsname


          is forbidden. But, after defxyz{abc},



          csname xyz defendcsname


          will be legal and equivalent to saying csname abcdefendcsname or abcdef.



          Final note



          It's better to add something about category codes. An active character in csname...endcsname will be expanded, so to get a literal ~ one has to write string~. Comment (category 14), ignored (category 9) and invalid (category 15) characters will remain such. So



          csname %endcsname


          will give an error (Missing endcsname); in csname ^^@endcsname there will be no character and csname ^^?endcsname will raise an error.






          share|improve this answer














          Normally, control sequence names are made only of letters or of one non-letter character.



          A letter is, more precisely, a character having category code 11 at the moment the control sequence name is read. So, any character can become part of a control sequence name, provided we change its catcode before the definition and each usage.



          With csname...endcsname we are freed from this limitation and every character can go inside them to form a control sequence name (of course, % is excluded because it disappears together what remains on the line before TeX is doing its work on characters).



          However, this is not the main purpose of csname...endcsname. This construction is used to build commands from "variable parts". Think, for instance to LaTeX's newcounter: after newcounter{foo}, TeX knows thefoo that is built precisely in this way. Roughly, what LaTeX does is



          newcommand{newcounter}[1]{%
          expandafternewcountcsname c@#1endcsname
          expandafterdefcsname the#1endcsname{arabic{#1}}%
          }


          so that newcounter{foo} does the right job. It's more complicated than this, of course, but the main things are here; newcount is the low-level command to allocate a counter. The expandafter is just to build the control sequence before newcount and def see the token.



          Inside csname...endcsname, category codes don't matter (with one main exception: active characters will be expanded if not preceded by string, see final note). LaTeX exploits this in order to build control sequence names that users won't be able to access (easily). For example, the control sequence to choose the default ten point font is OT1/cmr/m/n/10, which can be easily split internally (by the "reverse" operation that is string) and is not available to the casual user.



          Another important use is in environments: when you say newenvironment{foo}, LaTeX really defines foo and endfoo. Upon finding begin{foo}, LaTeX does some bookkeeping and then executes csname fooendcsname (that's why one can say also newenvironment{foo*}); similarly, at end{foo} LaTeX executes csname endfooendcsname and after this it does some bookkeeping again.



          Other uses: label{foo} will define control sequences based on foo via csname...endcsname that can be used by ref.



          When one says csname fooendcsname, LaTeX will look whether foo is defined; if not, it will execute relax and from then on (respecting grouping), foo will be interpreted as relax. An interesting usage for this feature is that one can say



          chapter*{Introduction}
          csname phantomsectionendcsname
          addcontentsline{toc}{chapter}{Introduction}


          and keep hyperref happy if it's loaded, while doing nothing if the package is not loaded.



          It's possible to give many other interesting uses of this trick. But one should always keep in mind that TeX does complete expansion of what it finds in that context and that only characters must remain. So



          csname abcrelax defendcsname


          is forbidden. But, after defxyz{abc},



          csname xyz defendcsname


          will be legal and equivalent to saying csname abcdefendcsname or abcdef.



          Final note



          It's better to add something about category codes. An active character in csname...endcsname will be expanded, so to get a literal ~ one has to write string~. Comment (category 14), ignored (category 9) and invalid (category 15) characters will remain such. So



          csname %endcsname


          will give an error (Missing endcsname); in csname ^^@endcsname there will be no character and csname ^^?endcsname will raise an error.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Sep 14 at 14:26

























          answered Dec 26 '11 at 22:38









          egreg

          706k8618773157




          706k8618773157








          • 2




            Braces don't need to be balanced. expandaftershowcsname{endcsname works fine with usual catcodes. Otherwise, very good response.
            – Bruno Le Floch
            Dec 27 '11 at 2:03






          • 1




            @BrunoLeFloch Right; they have to be balanced only if used to surround arguments to macros, of course.
            – egreg
            Dec 27 '11 at 10:37














          • 2




            Braces don't need to be balanced. expandaftershowcsname{endcsname works fine with usual catcodes. Otherwise, very good response.
            – Bruno Le Floch
            Dec 27 '11 at 2:03






          • 1




            @BrunoLeFloch Right; they have to be balanced only if used to surround arguments to macros, of course.
            – egreg
            Dec 27 '11 at 10:37








          2




          2




          Braces don't need to be balanced. expandaftershowcsname{endcsname works fine with usual catcodes. Otherwise, very good response.
          – Bruno Le Floch
          Dec 27 '11 at 2:03




          Braces don't need to be balanced. expandaftershowcsname{endcsname works fine with usual catcodes. Otherwise, very good response.
          – Bruno Le Floch
          Dec 27 '11 at 2:03




          1




          1




          @BrunoLeFloch Right; they have to be balanced only if used to surround arguments to macros, of course.
          – egreg
          Dec 27 '11 at 10:37




          @BrunoLeFloch Right; they have to be balanced only if used to surround arguments to macros, of course.
          – egreg
          Dec 27 '11 at 10:37










          up vote
          32
          down vote













          For reference, from the TeX Book (with slight formatting changes), Chapter 7: How TeX Reads What You Type (p 40):




          ...you can go from a list of character tokens to a control sequence by
          saying csname<tokens>endcsname. The tokens that appear in this
          construction between csname and endcsname may include other
          control sequences, as long as those control sequences ultimately
          expand into characters instead of TeX primitives; the final characters
          can be of any category, not necessarily letters. For example, csname
          TeXendcsname
          is essentially the same as TeX; but
          csnameTeXendcsname is illegal, because TeX expands into tokens
          containing the kern primitive. Furthermore,
          csnamestringTeXendcsname will produce the unusual control
          sequence \TeX, i.e., the token <TeX>, which you can't ordinarily
          write.




          I have used this indirectly by using the label-ref system and defining labels based on counters:



          newcounter{mycount}
          %...
          newcommand{mycmd}{%
          stepcounter{mycount}%
          label{abcthemycount}%
          %...
          }


          This creates a "successive label abc1, abc2, ... for every call to mycmd, in order to avoid creating multiply defined labels with the same name. Indirectly, label{abcthemycount} calls @namedef{r@abcthemycount}, which calls



          expandafterdefcsname r@abcthemycountendcsname


          thereby expanding r@abcthemycount to r@abc1 and defining r@abc1 for the first label, r@abc2 for the second label, etc. Yes, labels in LaTeX are actually control sequences prepended with r@ and is constructed using csname ... endcsname which then allows numerals.






          share|improve this answer

























            up vote
            32
            down vote













            For reference, from the TeX Book (with slight formatting changes), Chapter 7: How TeX Reads What You Type (p 40):




            ...you can go from a list of character tokens to a control sequence by
            saying csname<tokens>endcsname. The tokens that appear in this
            construction between csname and endcsname may include other
            control sequences, as long as those control sequences ultimately
            expand into characters instead of TeX primitives; the final characters
            can be of any category, not necessarily letters. For example, csname
            TeXendcsname
            is essentially the same as TeX; but
            csnameTeXendcsname is illegal, because TeX expands into tokens
            containing the kern primitive. Furthermore,
            csnamestringTeXendcsname will produce the unusual control
            sequence \TeX, i.e., the token <TeX>, which you can't ordinarily
            write.




            I have used this indirectly by using the label-ref system and defining labels based on counters:



            newcounter{mycount}
            %...
            newcommand{mycmd}{%
            stepcounter{mycount}%
            label{abcthemycount}%
            %...
            }


            This creates a "successive label abc1, abc2, ... for every call to mycmd, in order to avoid creating multiply defined labels with the same name. Indirectly, label{abcthemycount} calls @namedef{r@abcthemycount}, which calls



            expandafterdefcsname r@abcthemycountendcsname


            thereby expanding r@abcthemycount to r@abc1 and defining r@abc1 for the first label, r@abc2 for the second label, etc. Yes, labels in LaTeX are actually control sequences prepended with r@ and is constructed using csname ... endcsname which then allows numerals.






            share|improve this answer























              up vote
              32
              down vote










              up vote
              32
              down vote









              For reference, from the TeX Book (with slight formatting changes), Chapter 7: How TeX Reads What You Type (p 40):




              ...you can go from a list of character tokens to a control sequence by
              saying csname<tokens>endcsname. The tokens that appear in this
              construction between csname and endcsname may include other
              control sequences, as long as those control sequences ultimately
              expand into characters instead of TeX primitives; the final characters
              can be of any category, not necessarily letters. For example, csname
              TeXendcsname
              is essentially the same as TeX; but
              csnameTeXendcsname is illegal, because TeX expands into tokens
              containing the kern primitive. Furthermore,
              csnamestringTeXendcsname will produce the unusual control
              sequence \TeX, i.e., the token <TeX>, which you can't ordinarily
              write.




              I have used this indirectly by using the label-ref system and defining labels based on counters:



              newcounter{mycount}
              %...
              newcommand{mycmd}{%
              stepcounter{mycount}%
              label{abcthemycount}%
              %...
              }


              This creates a "successive label abc1, abc2, ... for every call to mycmd, in order to avoid creating multiply defined labels with the same name. Indirectly, label{abcthemycount} calls @namedef{r@abcthemycount}, which calls



              expandafterdefcsname r@abcthemycountendcsname


              thereby expanding r@abcthemycount to r@abc1 and defining r@abc1 for the first label, r@abc2 for the second label, etc. Yes, labels in LaTeX are actually control sequences prepended with r@ and is constructed using csname ... endcsname which then allows numerals.






              share|improve this answer












              For reference, from the TeX Book (with slight formatting changes), Chapter 7: How TeX Reads What You Type (p 40):




              ...you can go from a list of character tokens to a control sequence by
              saying csname<tokens>endcsname. The tokens that appear in this
              construction between csname and endcsname may include other
              control sequences, as long as those control sequences ultimately
              expand into characters instead of TeX primitives; the final characters
              can be of any category, not necessarily letters. For example, csname
              TeXendcsname
              is essentially the same as TeX; but
              csnameTeXendcsname is illegal, because TeX expands into tokens
              containing the kern primitive. Furthermore,
              csnamestringTeXendcsname will produce the unusual control
              sequence \TeX, i.e., the token <TeX>, which you can't ordinarily
              write.




              I have used this indirectly by using the label-ref system and defining labels based on counters:



              newcounter{mycount}
              %...
              newcommand{mycmd}{%
              stepcounter{mycount}%
              label{abcthemycount}%
              %...
              }


              This creates a "successive label abc1, abc2, ... for every call to mycmd, in order to avoid creating multiply defined labels with the same name. Indirectly, label{abcthemycount} calls @namedef{r@abcthemycount}, which calls



              expandafterdefcsname r@abcthemycountendcsname


              thereby expanding r@abcthemycount to r@abc1 and defining r@abc1 for the first label, r@abc2 for the second label, etc. Yes, labels in LaTeX are actually control sequences prepended with r@ and is constructed using csname ... endcsname which then allows numerals.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Dec 27 '11 at 3:23









              Werner

              435k629571645




              435k629571645






















                  up vote
                  23
                  down vote













                  csname/endcsname allows you to build commands whose names contains 1. non-letters (e.g. dots or colons or numbers) and - more importantly - 2. commands which are expanded when you define or use the command. Both is useful if you want to construct a command name from various pieces of informations.



                  As an example: The xskak-Package loops through the notation of a chess game and stores a lot of informations of every move in commands. Its code contains a lot of definition of this type:



                  expandafterxdef
                  csname Xskak.xskak@val@gameid.thec@move.WhiteToMove{w}{b}.pieceendcsname{%
                  ....
                  }


                  where xskak@val@gameid is the id of the current game, thec@move gives the current move number, WhiteToMove{w}{b} gives w or b depending on which player currently moves. So in the 10th move of black in the game with id "mygame" this xdef defines a "command" Xskak.mygame.10.b.piece which contains the name of the piece which has been moved by black in the tenth move.






                  share|improve this answer

























                    up vote
                    23
                    down vote













                    csname/endcsname allows you to build commands whose names contains 1. non-letters (e.g. dots or colons or numbers) and - more importantly - 2. commands which are expanded when you define or use the command. Both is useful if you want to construct a command name from various pieces of informations.



                    As an example: The xskak-Package loops through the notation of a chess game and stores a lot of informations of every move in commands. Its code contains a lot of definition of this type:



                    expandafterxdef
                    csname Xskak.xskak@val@gameid.thec@move.WhiteToMove{w}{b}.pieceendcsname{%
                    ....
                    }


                    where xskak@val@gameid is the id of the current game, thec@move gives the current move number, WhiteToMove{w}{b} gives w or b depending on which player currently moves. So in the 10th move of black in the game with id "mygame" this xdef defines a "command" Xskak.mygame.10.b.piece which contains the name of the piece which has been moved by black in the tenth move.






                    share|improve this answer























                      up vote
                      23
                      down vote










                      up vote
                      23
                      down vote









                      csname/endcsname allows you to build commands whose names contains 1. non-letters (e.g. dots or colons or numbers) and - more importantly - 2. commands which are expanded when you define or use the command. Both is useful if you want to construct a command name from various pieces of informations.



                      As an example: The xskak-Package loops through the notation of a chess game and stores a lot of informations of every move in commands. Its code contains a lot of definition of this type:



                      expandafterxdef
                      csname Xskak.xskak@val@gameid.thec@move.WhiteToMove{w}{b}.pieceendcsname{%
                      ....
                      }


                      where xskak@val@gameid is the id of the current game, thec@move gives the current move number, WhiteToMove{w}{b} gives w or b depending on which player currently moves. So in the 10th move of black in the game with id "mygame" this xdef defines a "command" Xskak.mygame.10.b.piece which contains the name of the piece which has been moved by black in the tenth move.






                      share|improve this answer












                      csname/endcsname allows you to build commands whose names contains 1. non-letters (e.g. dots or colons or numbers) and - more importantly - 2. commands which are expanded when you define or use the command. Both is useful if you want to construct a command name from various pieces of informations.



                      As an example: The xskak-Package loops through the notation of a chess game and stores a lot of informations of every move in commands. Its code contains a lot of definition of this type:



                      expandafterxdef
                      csname Xskak.xskak@val@gameid.thec@move.WhiteToMove{w}{b}.pieceendcsname{%
                      ....
                      }


                      where xskak@val@gameid is the id of the current game, thec@move gives the current move number, WhiteToMove{w}{b} gives w or b depending on which player currently moves. So in the 10th move of black in the game with id "mygame" this xdef defines a "command" Xskak.mygame.10.b.piece which contains the name of the piece which has been moved by black in the tenth move.







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered Dec 27 '11 at 9:16









                      Ulrike Fischer

                      185k7289666




                      185k7289666






















                          up vote
                          22
                          down vote













                          Suppose you want to define a command foo2. You cannot do this because 2 is not a letter. However, this construction works: csname foo2endcsname. Sometimes this is useful, e.g. when you need a series of commands, foo1, foo2, etc (another way is to use roman numerals). Another example, suppose you want to define a series of commands like endsection, endsubsection, etc. Then you can use a loop with expandafterdefcsname end#1csname...






                          share|improve this answer





















                          • Thanks for your example, but can you tell me what generally their job are? When and where do I need to use them?
                            – Vahid Damanafshan
                            Dec 26 '11 at 22:35






                          • 4




                            Well, @egreg beat me to it. Basically a TeX command is either (1) a sequence of letters starting from `, e.g. parskip, or (2) a special symbol optionally preceded by a backslash, e.g. @, and (3) any sequence of symbols between csname` and endcsname. So the job of these commands is to introduce a way to produce TeX commands. You do not need to use them unless you do TeX programming. In the latter case they are handy.
                            – Boris
                            Dec 26 '11 at 23:34

















                          up vote
                          22
                          down vote













                          Suppose you want to define a command foo2. You cannot do this because 2 is not a letter. However, this construction works: csname foo2endcsname. Sometimes this is useful, e.g. when you need a series of commands, foo1, foo2, etc (another way is to use roman numerals). Another example, suppose you want to define a series of commands like endsection, endsubsection, etc. Then you can use a loop with expandafterdefcsname end#1csname...






                          share|improve this answer





















                          • Thanks for your example, but can you tell me what generally their job are? When and where do I need to use them?
                            – Vahid Damanafshan
                            Dec 26 '11 at 22:35






                          • 4




                            Well, @egreg beat me to it. Basically a TeX command is either (1) a sequence of letters starting from `, e.g. parskip, or (2) a special symbol optionally preceded by a backslash, e.g. @, and (3) any sequence of symbols between csname` and endcsname. So the job of these commands is to introduce a way to produce TeX commands. You do not need to use them unless you do TeX programming. In the latter case they are handy.
                            – Boris
                            Dec 26 '11 at 23:34















                          up vote
                          22
                          down vote










                          up vote
                          22
                          down vote









                          Suppose you want to define a command foo2. You cannot do this because 2 is not a letter. However, this construction works: csname foo2endcsname. Sometimes this is useful, e.g. when you need a series of commands, foo1, foo2, etc (another way is to use roman numerals). Another example, suppose you want to define a series of commands like endsection, endsubsection, etc. Then you can use a loop with expandafterdefcsname end#1csname...






                          share|improve this answer












                          Suppose you want to define a command foo2. You cannot do this because 2 is not a letter. However, this construction works: csname foo2endcsname. Sometimes this is useful, e.g. when you need a series of commands, foo1, foo2, etc (another way is to use roman numerals). Another example, suppose you want to define a series of commands like endsection, endsubsection, etc. Then you can use a loop with expandafterdefcsname end#1csname...







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Dec 26 '11 at 22:21









                          Boris

                          29.9k262106




                          29.9k262106












                          • Thanks for your example, but can you tell me what generally their job are? When and where do I need to use them?
                            – Vahid Damanafshan
                            Dec 26 '11 at 22:35






                          • 4




                            Well, @egreg beat me to it. Basically a TeX command is either (1) a sequence of letters starting from `, e.g. parskip, or (2) a special symbol optionally preceded by a backslash, e.g. @, and (3) any sequence of symbols between csname` and endcsname. So the job of these commands is to introduce a way to produce TeX commands. You do not need to use them unless you do TeX programming. In the latter case they are handy.
                            – Boris
                            Dec 26 '11 at 23:34




















                          • Thanks for your example, but can you tell me what generally their job are? When and where do I need to use them?
                            – Vahid Damanafshan
                            Dec 26 '11 at 22:35






                          • 4




                            Well, @egreg beat me to it. Basically a TeX command is either (1) a sequence of letters starting from `, e.g. parskip, or (2) a special symbol optionally preceded by a backslash, e.g. @, and (3) any sequence of symbols between csname` and endcsname. So the job of these commands is to introduce a way to produce TeX commands. You do not need to use them unless you do TeX programming. In the latter case they are handy.
                            – Boris
                            Dec 26 '11 at 23:34


















                          Thanks for your example, but can you tell me what generally their job are? When and where do I need to use them?
                          – Vahid Damanafshan
                          Dec 26 '11 at 22:35




                          Thanks for your example, but can you tell me what generally their job are? When and where do I need to use them?
                          – Vahid Damanafshan
                          Dec 26 '11 at 22:35




                          4




                          4




                          Well, @egreg beat me to it. Basically a TeX command is either (1) a sequence of letters starting from `, e.g. parskip, or (2) a special symbol optionally preceded by a backslash, e.g. @, and (3) any sequence of symbols between csname` and endcsname. So the job of these commands is to introduce a way to produce TeX commands. You do not need to use them unless you do TeX programming. In the latter case they are handy.
                          – Boris
                          Dec 26 '11 at 23:34






                          Well, @egreg beat me to it. Basically a TeX command is either (1) a sequence of letters starting from `, e.g. parskip, or (2) a special symbol optionally preceded by a backslash, e.g. @, and (3) any sequence of symbols between csname` and endcsname. So the job of these commands is to introduce a way to produce TeX commands. You do not need to use them unless you do TeX programming. In the latter case they are handy.
                          – Boris
                          Dec 26 '11 at 23:34












                          up vote
                          18
                          down vote













                          Short answer: csname and endcsname are a "macro environment" whose contents, if they evaluate (after expanding macros) to "ordinary text", are converted into the name of a macro (or control sequence, hence "csname").





                          Actually, it is a perhaps strange joke that by the rules of LaTeX macros, you can actually write begin{csname}...end{csname} and it will act as you expect, to a certain extent. For example:



                          defmacro{text}
                          defo{o}
                          begin{csname}%
                          macro
                          end{csname}
                          % Same as csname macro endcsname


                          (when run with latex rather than tex) will produce the word "text" in the output. The % sign is there so that unnecessary spaces don't creep into the name of the macro we are constructing.






                          share|improve this answer



























                            up vote
                            18
                            down vote













                            Short answer: csname and endcsname are a "macro environment" whose contents, if they evaluate (after expanding macros) to "ordinary text", are converted into the name of a macro (or control sequence, hence "csname").





                            Actually, it is a perhaps strange joke that by the rules of LaTeX macros, you can actually write begin{csname}...end{csname} and it will act as you expect, to a certain extent. For example:



                            defmacro{text}
                            defo{o}
                            begin{csname}%
                            macro
                            end{csname}
                            % Same as csname macro endcsname


                            (when run with latex rather than tex) will produce the word "text" in the output. The % sign is there so that unnecessary spaces don't creep into the name of the macro we are constructing.






                            share|improve this answer

























                              up vote
                              18
                              down vote










                              up vote
                              18
                              down vote









                              Short answer: csname and endcsname are a "macro environment" whose contents, if they evaluate (after expanding macros) to "ordinary text", are converted into the name of a macro (or control sequence, hence "csname").





                              Actually, it is a perhaps strange joke that by the rules of LaTeX macros, you can actually write begin{csname}...end{csname} and it will act as you expect, to a certain extent. For example:



                              defmacro{text}
                              defo{o}
                              begin{csname}%
                              macro
                              end{csname}
                              % Same as csname macro endcsname


                              (when run with latex rather than tex) will produce the word "text" in the output. The % sign is there so that unnecessary spaces don't creep into the name of the macro we are constructing.






                              share|improve this answer














                              Short answer: csname and endcsname are a "macro environment" whose contents, if they evaluate (after expanding macros) to "ordinary text", are converted into the name of a macro (or control sequence, hence "csname").





                              Actually, it is a perhaps strange joke that by the rules of LaTeX macros, you can actually write begin{csname}...end{csname} and it will act as you expect, to a certain extent. For example:



                              defmacro{text}
                              defo{o}
                              begin{csname}%
                              macro
                              end{csname}
                              % Same as csname macro endcsname


                              (when run with latex rather than tex) will produce the word "text" in the output. The % sign is there so that unnecessary spaces don't creep into the name of the macro we are constructing.







                              share|improve this answer














                              share|improve this answer



                              share|improve this answer








                              edited Dec 27 '11 at 9:09

























                              answered Dec 27 '11 at 4:38









                              Ryan Reich

                              31.1k799158




                              31.1k799158






















                                  up vote
                                  0
                                  down vote













                                  As a very beginner for this antique problem, I just provide a simple example that may tell future novice something about csname. Though I do not fully understand I have tried it and successfully solved one problem of mine.



                                  My problem was to test different effect of different font command, like:



                                  textit{textit} textbf{textbf} {bfseries bfseries} {small small}


                                  and I tried to create a new command newcommand{FontTest}[1]{#1 #1}, I had quite a struggle wondering how to turn the first #1 to a command. And after many trials I used csname and it worked, so it was:



                                  newcommand{FontTest}[1]{{ csname #1endcsname{#1}}}


                                  and I can freely test different type of font families and shapes like: FontTest{textit} FontTest{sffamily} etc.



                                  And its effect seems like turning a string into command I guess.





                                  share








                                  New contributor




                                  Pistachio Guoguo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                  Check out our Code of Conduct.






















                                    up vote
                                    0
                                    down vote













                                    As a very beginner for this antique problem, I just provide a simple example that may tell future novice something about csname. Though I do not fully understand I have tried it and successfully solved one problem of mine.



                                    My problem was to test different effect of different font command, like:



                                    textit{textit} textbf{textbf} {bfseries bfseries} {small small}


                                    and I tried to create a new command newcommand{FontTest}[1]{#1 #1}, I had quite a struggle wondering how to turn the first #1 to a command. And after many trials I used csname and it worked, so it was:



                                    newcommand{FontTest}[1]{{ csname #1endcsname{#1}}}


                                    and I can freely test different type of font families and shapes like: FontTest{textit} FontTest{sffamily} etc.



                                    And its effect seems like turning a string into command I guess.





                                    share








                                    New contributor




                                    Pistachio Guoguo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                    Check out our Code of Conduct.




















                                      up vote
                                      0
                                      down vote










                                      up vote
                                      0
                                      down vote









                                      As a very beginner for this antique problem, I just provide a simple example that may tell future novice something about csname. Though I do not fully understand I have tried it and successfully solved one problem of mine.



                                      My problem was to test different effect of different font command, like:



                                      textit{textit} textbf{textbf} {bfseries bfseries} {small small}


                                      and I tried to create a new command newcommand{FontTest}[1]{#1 #1}, I had quite a struggle wondering how to turn the first #1 to a command. And after many trials I used csname and it worked, so it was:



                                      newcommand{FontTest}[1]{{ csname #1endcsname{#1}}}


                                      and I can freely test different type of font families and shapes like: FontTest{textit} FontTest{sffamily} etc.



                                      And its effect seems like turning a string into command I guess.





                                      share








                                      New contributor




                                      Pistachio Guoguo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.









                                      As a very beginner for this antique problem, I just provide a simple example that may tell future novice something about csname. Though I do not fully understand I have tried it and successfully solved one problem of mine.



                                      My problem was to test different effect of different font command, like:



                                      textit{textit} textbf{textbf} {bfseries bfseries} {small small}


                                      and I tried to create a new command newcommand{FontTest}[1]{#1 #1}, I had quite a struggle wondering how to turn the first #1 to a command. And after many trials I used csname and it worked, so it was:



                                      newcommand{FontTest}[1]{{ csname #1endcsname{#1}}}


                                      and I can freely test different type of font families and shapes like: FontTest{textit} FontTest{sffamily} etc.



                                      And its effect seems like turning a string into command I guess.






                                      share








                                      New contributor




                                      Pistachio Guoguo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.








                                      share


                                      share






                                      New contributor




                                      Pistachio Guoguo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.









                                      answered 8 mins ago









                                      Pistachio Guoguo

                                      1




                                      1




                                      New contributor




                                      Pistachio Guoguo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.





                                      New contributor





                                      Pistachio Guoguo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.






                                      Pistachio Guoguo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.






























                                          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.





                                          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                                          Please pay close attention to the following guidance:


                                          • 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%2f39380%2fwhat-exactly-do-csname-and-endcsname-do%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

                                          A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

                                          Calculate evaluation metrics using cross_val_predict sklearn

                                          Insert data from modal to MySQL (multiple modal on website)