Question about exercise 11.5 in TeXbook





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








9















In answer to exercise 11.5 there is this comment:



def\{ifspacenext % assume that next is unexpandable


What does this comment mean? If next may be expandable,
must we use the following instead?



def\{expandafterifxspacenext %


Can anybody think about an example which illustrates the difference?



Also, the result does not change if we change endlist to just end as follows:



-defdodolist{ifxnextendlist letnextrelax
+defdodolist{ifxnextend letnextrelax




-defendlist{endlist}
+%defend{endlist}




-defdemobox#1{setbox0=hbox{dolist#1endlist}%
+defdemobox#1{setbox0=hbox{dolist#1end}%


What is the point of using endlist?



EDIT



I think defining a control sequence, which need not be defined, the way
endlist is defined here, gives the user a way to tell whether a particular name
is in use, when he chooses a name for a new control sequence.





This is the full example:



defdolist{afterassignmentdodolistletnext= }
defdodolist{ifxnextendlist letnextrelax
else \letnextdolist fi
next}
defendlist{endlist}
defhidehrule#1#2{kern-#1%
hrule height#1 depth#2 kern-#2 }
defhidevrule#1#2{kern-#1{dimen0=#1
advancedimen0 by#2vrule widthdimen0}kern-#2 }
defmakeblankbox#1#2{hbox{lowerdp0vbox{hidehrule{#1}{#2}%
kern-#1 % overlap the rules at the corners
hbox to wd0{hidevrule{#1}{#2}%
raiseht0vbox to #1{}% set the vrule height
lowerdp0vtop to #1{}% set the vrule depth
hfilhidevrule{#2}{#1}}%
kern-#1hidehrule{#2}{#1}}}}
defmaketypebox{makeblankbox{0pt}{1pt}}
defmakelightbox{makeblankbox{.2pt}{.2pt}}
def\{ifspacenext % assume that next is unexpandable
else setbox0=hbox{next}maketypeboxfi}
defdemobox#1{setbox0=hbox{dolist#1endlist}%
leavevmodecopy0kern-wd0makelightbox}
demobox{Tough exercise.}
bye









share|improve this question

































    9















    In answer to exercise 11.5 there is this comment:



    def\{ifspacenext % assume that next is unexpandable


    What does this comment mean? If next may be expandable,
    must we use the following instead?



    def\{expandafterifxspacenext %


    Can anybody think about an example which illustrates the difference?



    Also, the result does not change if we change endlist to just end as follows:



    -defdodolist{ifxnextendlist letnextrelax
    +defdodolist{ifxnextend letnextrelax




    -defendlist{endlist}
    +%defend{endlist}




    -defdemobox#1{setbox0=hbox{dolist#1endlist}%
    +defdemobox#1{setbox0=hbox{dolist#1end}%


    What is the point of using endlist?



    EDIT



    I think defining a control sequence, which need not be defined, the way
    endlist is defined here, gives the user a way to tell whether a particular name
    is in use, when he chooses a name for a new control sequence.





    This is the full example:



    defdolist{afterassignmentdodolistletnext= }
    defdodolist{ifxnextendlist letnextrelax
    else \letnextdolist fi
    next}
    defendlist{endlist}
    defhidehrule#1#2{kern-#1%
    hrule height#1 depth#2 kern-#2 }
    defhidevrule#1#2{kern-#1{dimen0=#1
    advancedimen0 by#2vrule widthdimen0}kern-#2 }
    defmakeblankbox#1#2{hbox{lowerdp0vbox{hidehrule{#1}{#2}%
    kern-#1 % overlap the rules at the corners
    hbox to wd0{hidevrule{#1}{#2}%
    raiseht0vbox to #1{}% set the vrule height
    lowerdp0vtop to #1{}% set the vrule depth
    hfilhidevrule{#2}{#1}}%
    kern-#1hidehrule{#2}{#1}}}}
    defmaketypebox{makeblankbox{0pt}{1pt}}
    defmakelightbox{makeblankbox{.2pt}{.2pt}}
    def\{ifspacenext % assume that next is unexpandable
    else setbox0=hbox{next}maketypeboxfi}
    defdemobox#1{setbox0=hbox{dolist#1endlist}%
    leavevmodecopy0kern-wd0makelightbox}
    demobox{Tough exercise.}
    bye









    share|improve this question





























      9












      9








      9


      1






      In answer to exercise 11.5 there is this comment:



      def\{ifspacenext % assume that next is unexpandable


      What does this comment mean? If next may be expandable,
      must we use the following instead?



      def\{expandafterifxspacenext %


      Can anybody think about an example which illustrates the difference?



      Also, the result does not change if we change endlist to just end as follows:



      -defdodolist{ifxnextendlist letnextrelax
      +defdodolist{ifxnextend letnextrelax




      -defendlist{endlist}
      +%defend{endlist}




      -defdemobox#1{setbox0=hbox{dolist#1endlist}%
      +defdemobox#1{setbox0=hbox{dolist#1end}%


      What is the point of using endlist?



      EDIT



      I think defining a control sequence, which need not be defined, the way
      endlist is defined here, gives the user a way to tell whether a particular name
      is in use, when he chooses a name for a new control sequence.





      This is the full example:



      defdolist{afterassignmentdodolistletnext= }
      defdodolist{ifxnextendlist letnextrelax
      else \letnextdolist fi
      next}
      defendlist{endlist}
      defhidehrule#1#2{kern-#1%
      hrule height#1 depth#2 kern-#2 }
      defhidevrule#1#2{kern-#1{dimen0=#1
      advancedimen0 by#2vrule widthdimen0}kern-#2 }
      defmakeblankbox#1#2{hbox{lowerdp0vbox{hidehrule{#1}{#2}%
      kern-#1 % overlap the rules at the corners
      hbox to wd0{hidevrule{#1}{#2}%
      raiseht0vbox to #1{}% set the vrule height
      lowerdp0vtop to #1{}% set the vrule depth
      hfilhidevrule{#2}{#1}}%
      kern-#1hidehrule{#2}{#1}}}}
      defmaketypebox{makeblankbox{0pt}{1pt}}
      defmakelightbox{makeblankbox{.2pt}{.2pt}}
      def\{ifspacenext % assume that next is unexpandable
      else setbox0=hbox{next}maketypeboxfi}
      defdemobox#1{setbox0=hbox{dolist#1endlist}%
      leavevmodecopy0kern-wd0makelightbox}
      demobox{Tough exercise.}
      bye









      share|improve this question
















      In answer to exercise 11.5 there is this comment:



      def\{ifspacenext % assume that next is unexpandable


      What does this comment mean? If next may be expandable,
      must we use the following instead?



      def\{expandafterifxspacenext %


      Can anybody think about an example which illustrates the difference?



      Also, the result does not change if we change endlist to just end as follows:



      -defdodolist{ifxnextendlist letnextrelax
      +defdodolist{ifxnextend letnextrelax




      -defendlist{endlist}
      +%defend{endlist}




      -defdemobox#1{setbox0=hbox{dolist#1endlist}%
      +defdemobox#1{setbox0=hbox{dolist#1end}%


      What is the point of using endlist?



      EDIT



      I think defining a control sequence, which need not be defined, the way
      endlist is defined here, gives the user a way to tell whether a particular name
      is in use, when he chooses a name for a new control sequence.





      This is the full example:



      defdolist{afterassignmentdodolistletnext= }
      defdodolist{ifxnextendlist letnextrelax
      else \letnextdolist fi
      next}
      defendlist{endlist}
      defhidehrule#1#2{kern-#1%
      hrule height#1 depth#2 kern-#2 }
      defhidevrule#1#2{kern-#1{dimen0=#1
      advancedimen0 by#2vrule widthdimen0}kern-#2 }
      defmakeblankbox#1#2{hbox{lowerdp0vbox{hidehrule{#1}{#2}%
      kern-#1 % overlap the rules at the corners
      hbox to wd0{hidevrule{#1}{#2}%
      raiseht0vbox to #1{}% set the vrule height
      lowerdp0vtop to #1{}% set the vrule depth
      hfilhidevrule{#2}{#1}}%
      kern-#1hidehrule{#2}{#1}}}}
      defmaketypebox{makeblankbox{0pt}{1pt}}
      defmakelightbox{makeblankbox{.2pt}{.2pt}}
      def\{ifspacenext % assume that next is unexpandable
      else setbox0=hbox{next}maketypeboxfi}
      defdemobox#1{setbox0=hbox{dolist#1endlist}%
      leavevmodecopy0kern-wd0makelightbox}
      demobox{Tough exercise.}
      bye






      tex-core conditionals expansion






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited May 28 at 8:55







      Igor Liferenko

















      asked May 27 at 3:33









      Igor LiferenkoIgor Liferenko

      2,8478 silver badges31 bronze badges




      2,8478 silver badges31 bronze badges

























          2 Answers
          2






          active

          oldest

          votes


















          10
















          For readers who don't find the line:



          def\{ifspacenext % assume that next is unexpandable


          in their TeXbook, it is in the errata published by Donald E. Knuth (“page A311”).



          Suppose you do:



          deffoobar{cat}

          noindent
          demobox{The foobar in the hat}


          After next has grabbed the foobar token, \ will expand to something equivalent to:



          ifspacenext %
          else setbox0=hbox{next}maketypeboxfi


          with next being let-equal to foobar. According to the documentation of if (TeXbook p. 209), TeX is going to expand tokens following the if until it finds two non-expandable ones. space expands to an explicit space token in one step, so TeX goes on with next (which has the same meaning as foobar at this point), because it needs one more non-expandable token. After next has been expanded, the input is equivalent to:



          if〈space token〉cat %
          else setbox0=hbox{next}maketypeboxfi


          where 〈space token〉 represents an explicit space token (one could define a control sequence that is let-equal to an explicit space token and use it instead of 〈space token〉, see footnote 1 below). Now, TeX has two non-expandable tokens following the if: a space token and a c character token (of category 11 under the normal catcode regime). So, the outcome of the if can be decided: it is false because the character codes of a 〈space token〉 and of c differ, so TeX will skip to the else clause.



          There is no big problem so far, though we are going to box the whole cat at once instead of each character separately (c, a, and t); but let's back up a little bit. Had we used:



          deffoobar{ cat}


          the input would have been equivalent to:



          if〈space token〉〈space token〉cat %
          else setbox0=hbox{next}maketypeboxfi


          The test would have been true and TeX would have left cat in the input stream, which is plain wrong, because we were supposed to test what we just grabbed in next, not to insert new text!



          So, the comment “assume that next is unexpandable” could be rephrased more generally, in my humble opinion, as “assume that next ultimately expands to either (1) exactly one character token or (2) exactly one chardef token or (3) a control sequence token that is let-equal to (1) or (2)”2 (the character token in (1) is necessarily non-active, because of the “ultimately”). Indeed, you can test that demobox works perfectly when next recursively expands to a single character token, as in:



          defmyspacei{myspace}
          defmyspace{space}

          noindent
          demobox{Abc defmyspacei pU gHi}


          Screenshot



          Using myspacei here gives the same result as using an explicit space token, because it recursively expands to such a token.



          Here is another example that additionally uses a control sequence that recursively expands to a non-space character token:



          defmyspacei{myspace}
          defmyspace{space}

          defmyxii{myxi}
          defmyxi{myx}
          defmyx{X}

          noindent
          demobox{Abc defmyspacei pUmyxii gHi}


          Screenshot with also a non-space character token



          Your proposal:



          def\{expandafterifxspacenext %
          ...


          would also work, as long as next has been let-equal to a space token (explicit or implicit). But it wouldn't work with input containing spaces in the form of macros like space or our myspacei macro defined above. Indeed, ifx distinguishes between character tokens and macros (see specification of ifx p. 210 of the TeXbook).



          Finally, although it would work, your replacement of endlist with end does not sound like the best coding style to me, because end is an existing TeX primitive; Knuth chose something more “unique” to mark the end of the text to be worked on. Besides, the name endlist was visibly chosen to match dolist: it is a matter of consistency. See in particular:



          defdemobox#1{setbox0=hbox{dolist#1endlist}%
          ...




          Footnotes





          1. You can define a control sequence stoken that is let-equal to an explicit space token like this:



            {def\{globalletstoken= }\ }% now, stoken is an implicit space token


            (adapted from the TeXbook p. 376). Two other ways are given in the TeXbook p. 336 (exercise 24.6):



            def\{letstoken= }\ %


            and



            def\#1\{}futureletstoken\ \%


          2. This is in particular the case when next has been let-equal to a non-active character token—which is, I think, the case Knuth had in mind when he used the word “unexpandable” (indeed, a non-active character token, or a control sequence that has been let-equal to such a token, never expands). In other words, the condition “next is unexpandable” from the comment you quoted is a sufficient condition for ensuring that the macros behave sanely, and is only a particular case of the more general condition I gave. :-)







          share|improve this answer




























          • I just added a footnote clarifying why (presumably) Knuth used the word “unexpandable” in the comment you quoted (insofar as I can get a glimpse of what happens in Knuth's mind!).

            – frougon
            May 27 at 8:38













          • You say: "... as space is a macro ...", but this is not true, because expandafter makes space a space token.

            – Igor Liferenko
            May 27 at 8:46











          • end is used just as a token here. Knuth uses it a lot. For example, see final example in chapter 20.

            – Igor Liferenko
            May 27 at 8:49











          • space is defined in plain.tex with defspace{ }. Anything defined with def (or one of its variants) is a macro, that is the definition of a macro. If you still don't believe me, run texdef space. This outputs space: macro:-> .

            – frougon
            May 27 at 8:50











          • NO! See description of expandafter on p. 213

            – Igor Liferenko
            May 27 at 8:51



















          6
















          It means what it says: only unexpandable tokens are allowed in the argument to demobox. More precisely, character tokens or unexpandable control sequences that correspond (via chardef or let) to printable characters (including spaces).



          If you try



          demobox{abc def}

          defexpandable{expandable token}

          demobox{expandable}


          you get



          enter image description here



          which is probably not what you were expecting. On the other hand, a definition like



          defexpandable{ expandable token}


          would yield something very far from the expectations.



          So the demobox macro can be used only with its argument consisting of unexpandable tokens or macros expanding to a single unexpandable token.



          Also chardef tokens are allowed, as well as implicit character tokens. However bgroup would also be problematic: compare demobox{A bgroup ABegroup} with demobox{A AB}, to see the issue.



          You might want to extend demobox in various ways, but that's not the object of the exercise.



          About your suggestion to redefine dolist to use end instead of endlist: you can do it, if you prefer. Knuth doesn't prefer it; instead he uses a control sequence that's specific to dolist processing. Note that the definition of endlist will produce an infinite loop whenever endlist is expanded (probably by a mistake in the macros using dolist), whereas end wouldn't.






          share|improve this answer


























          • Actually, the example works just fine without the defendlist{endlist}. Not sure why this def was added at all (considering the object of the exercise).

            – Igor Liferenko
            May 28 at 6:57











          • @IgorLiferenko The dolist macro can be used in other situations.

            – egreg
            May 28 at 8:25













          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/4.0/"u003ecc by-sa 4.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%2f492807%2fquestion-about-exercise-11-5-in-texbook%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









          10
















          For readers who don't find the line:



          def\{ifspacenext % assume that next is unexpandable


          in their TeXbook, it is in the errata published by Donald E. Knuth (“page A311”).



          Suppose you do:



          deffoobar{cat}

          noindent
          demobox{The foobar in the hat}


          After next has grabbed the foobar token, \ will expand to something equivalent to:



          ifspacenext %
          else setbox0=hbox{next}maketypeboxfi


          with next being let-equal to foobar. According to the documentation of if (TeXbook p. 209), TeX is going to expand tokens following the if until it finds two non-expandable ones. space expands to an explicit space token in one step, so TeX goes on with next (which has the same meaning as foobar at this point), because it needs one more non-expandable token. After next has been expanded, the input is equivalent to:



          if〈space token〉cat %
          else setbox0=hbox{next}maketypeboxfi


          where 〈space token〉 represents an explicit space token (one could define a control sequence that is let-equal to an explicit space token and use it instead of 〈space token〉, see footnote 1 below). Now, TeX has two non-expandable tokens following the if: a space token and a c character token (of category 11 under the normal catcode regime). So, the outcome of the if can be decided: it is false because the character codes of a 〈space token〉 and of c differ, so TeX will skip to the else clause.



          There is no big problem so far, though we are going to box the whole cat at once instead of each character separately (c, a, and t); but let's back up a little bit. Had we used:



          deffoobar{ cat}


          the input would have been equivalent to:



          if〈space token〉〈space token〉cat %
          else setbox0=hbox{next}maketypeboxfi


          The test would have been true and TeX would have left cat in the input stream, which is plain wrong, because we were supposed to test what we just grabbed in next, not to insert new text!



          So, the comment “assume that next is unexpandable” could be rephrased more generally, in my humble opinion, as “assume that next ultimately expands to either (1) exactly one character token or (2) exactly one chardef token or (3) a control sequence token that is let-equal to (1) or (2)”2 (the character token in (1) is necessarily non-active, because of the “ultimately”). Indeed, you can test that demobox works perfectly when next recursively expands to a single character token, as in:



          defmyspacei{myspace}
          defmyspace{space}

          noindent
          demobox{Abc defmyspacei pU gHi}


          Screenshot



          Using myspacei here gives the same result as using an explicit space token, because it recursively expands to such a token.



          Here is another example that additionally uses a control sequence that recursively expands to a non-space character token:



          defmyspacei{myspace}
          defmyspace{space}

          defmyxii{myxi}
          defmyxi{myx}
          defmyx{X}

          noindent
          demobox{Abc defmyspacei pUmyxii gHi}


          Screenshot with also a non-space character token



          Your proposal:



          def\{expandafterifxspacenext %
          ...


          would also work, as long as next has been let-equal to a space token (explicit or implicit). But it wouldn't work with input containing spaces in the form of macros like space or our myspacei macro defined above. Indeed, ifx distinguishes between character tokens and macros (see specification of ifx p. 210 of the TeXbook).



          Finally, although it would work, your replacement of endlist with end does not sound like the best coding style to me, because end is an existing TeX primitive; Knuth chose something more “unique” to mark the end of the text to be worked on. Besides, the name endlist was visibly chosen to match dolist: it is a matter of consistency. See in particular:



          defdemobox#1{setbox0=hbox{dolist#1endlist}%
          ...




          Footnotes





          1. You can define a control sequence stoken that is let-equal to an explicit space token like this:



            {def\{globalletstoken= }\ }% now, stoken is an implicit space token


            (adapted from the TeXbook p. 376). Two other ways are given in the TeXbook p. 336 (exercise 24.6):



            def\{letstoken= }\ %


            and



            def\#1\{}futureletstoken\ \%


          2. This is in particular the case when next has been let-equal to a non-active character token—which is, I think, the case Knuth had in mind when he used the word “unexpandable” (indeed, a non-active character token, or a control sequence that has been let-equal to such a token, never expands). In other words, the condition “next is unexpandable” from the comment you quoted is a sufficient condition for ensuring that the macros behave sanely, and is only a particular case of the more general condition I gave. :-)







          share|improve this answer




























          • I just added a footnote clarifying why (presumably) Knuth used the word “unexpandable” in the comment you quoted (insofar as I can get a glimpse of what happens in Knuth's mind!).

            – frougon
            May 27 at 8:38













          • You say: "... as space is a macro ...", but this is not true, because expandafter makes space a space token.

            – Igor Liferenko
            May 27 at 8:46











          • end is used just as a token here. Knuth uses it a lot. For example, see final example in chapter 20.

            – Igor Liferenko
            May 27 at 8:49











          • space is defined in plain.tex with defspace{ }. Anything defined with def (or one of its variants) is a macro, that is the definition of a macro. If you still don't believe me, run texdef space. This outputs space: macro:-> .

            – frougon
            May 27 at 8:50











          • NO! See description of expandafter on p. 213

            – Igor Liferenko
            May 27 at 8:51
















          10
















          For readers who don't find the line:



          def\{ifspacenext % assume that next is unexpandable


          in their TeXbook, it is in the errata published by Donald E. Knuth (“page A311”).



          Suppose you do:



          deffoobar{cat}

          noindent
          demobox{The foobar in the hat}


          After next has grabbed the foobar token, \ will expand to something equivalent to:



          ifspacenext %
          else setbox0=hbox{next}maketypeboxfi


          with next being let-equal to foobar. According to the documentation of if (TeXbook p. 209), TeX is going to expand tokens following the if until it finds two non-expandable ones. space expands to an explicit space token in one step, so TeX goes on with next (which has the same meaning as foobar at this point), because it needs one more non-expandable token. After next has been expanded, the input is equivalent to:



          if〈space token〉cat %
          else setbox0=hbox{next}maketypeboxfi


          where 〈space token〉 represents an explicit space token (one could define a control sequence that is let-equal to an explicit space token and use it instead of 〈space token〉, see footnote 1 below). Now, TeX has two non-expandable tokens following the if: a space token and a c character token (of category 11 under the normal catcode regime). So, the outcome of the if can be decided: it is false because the character codes of a 〈space token〉 and of c differ, so TeX will skip to the else clause.



          There is no big problem so far, though we are going to box the whole cat at once instead of each character separately (c, a, and t); but let's back up a little bit. Had we used:



          deffoobar{ cat}


          the input would have been equivalent to:



          if〈space token〉〈space token〉cat %
          else setbox0=hbox{next}maketypeboxfi


          The test would have been true and TeX would have left cat in the input stream, which is plain wrong, because we were supposed to test what we just grabbed in next, not to insert new text!



          So, the comment “assume that next is unexpandable” could be rephrased more generally, in my humble opinion, as “assume that next ultimately expands to either (1) exactly one character token or (2) exactly one chardef token or (3) a control sequence token that is let-equal to (1) or (2)”2 (the character token in (1) is necessarily non-active, because of the “ultimately”). Indeed, you can test that demobox works perfectly when next recursively expands to a single character token, as in:



          defmyspacei{myspace}
          defmyspace{space}

          noindent
          demobox{Abc defmyspacei pU gHi}


          Screenshot



          Using myspacei here gives the same result as using an explicit space token, because it recursively expands to such a token.



          Here is another example that additionally uses a control sequence that recursively expands to a non-space character token:



          defmyspacei{myspace}
          defmyspace{space}

          defmyxii{myxi}
          defmyxi{myx}
          defmyx{X}

          noindent
          demobox{Abc defmyspacei pUmyxii gHi}


          Screenshot with also a non-space character token



          Your proposal:



          def\{expandafterifxspacenext %
          ...


          would also work, as long as next has been let-equal to a space token (explicit or implicit). But it wouldn't work with input containing spaces in the form of macros like space or our myspacei macro defined above. Indeed, ifx distinguishes between character tokens and macros (see specification of ifx p. 210 of the TeXbook).



          Finally, although it would work, your replacement of endlist with end does not sound like the best coding style to me, because end is an existing TeX primitive; Knuth chose something more “unique” to mark the end of the text to be worked on. Besides, the name endlist was visibly chosen to match dolist: it is a matter of consistency. See in particular:



          defdemobox#1{setbox0=hbox{dolist#1endlist}%
          ...




          Footnotes





          1. You can define a control sequence stoken that is let-equal to an explicit space token like this:



            {def\{globalletstoken= }\ }% now, stoken is an implicit space token


            (adapted from the TeXbook p. 376). Two other ways are given in the TeXbook p. 336 (exercise 24.6):



            def\{letstoken= }\ %


            and



            def\#1\{}futureletstoken\ \%


          2. This is in particular the case when next has been let-equal to a non-active character token—which is, I think, the case Knuth had in mind when he used the word “unexpandable” (indeed, a non-active character token, or a control sequence that has been let-equal to such a token, never expands). In other words, the condition “next is unexpandable” from the comment you quoted is a sufficient condition for ensuring that the macros behave sanely, and is only a particular case of the more general condition I gave. :-)







          share|improve this answer




























          • I just added a footnote clarifying why (presumably) Knuth used the word “unexpandable” in the comment you quoted (insofar as I can get a glimpse of what happens in Knuth's mind!).

            – frougon
            May 27 at 8:38













          • You say: "... as space is a macro ...", but this is not true, because expandafter makes space a space token.

            – Igor Liferenko
            May 27 at 8:46











          • end is used just as a token here. Knuth uses it a lot. For example, see final example in chapter 20.

            – Igor Liferenko
            May 27 at 8:49











          • space is defined in plain.tex with defspace{ }. Anything defined with def (or one of its variants) is a macro, that is the definition of a macro. If you still don't believe me, run texdef space. This outputs space: macro:-> .

            – frougon
            May 27 at 8:50











          • NO! See description of expandafter on p. 213

            – Igor Liferenko
            May 27 at 8:51














          10














          10










          10









          For readers who don't find the line:



          def\{ifspacenext % assume that next is unexpandable


          in their TeXbook, it is in the errata published by Donald E. Knuth (“page A311”).



          Suppose you do:



          deffoobar{cat}

          noindent
          demobox{The foobar in the hat}


          After next has grabbed the foobar token, \ will expand to something equivalent to:



          ifspacenext %
          else setbox0=hbox{next}maketypeboxfi


          with next being let-equal to foobar. According to the documentation of if (TeXbook p. 209), TeX is going to expand tokens following the if until it finds two non-expandable ones. space expands to an explicit space token in one step, so TeX goes on with next (which has the same meaning as foobar at this point), because it needs one more non-expandable token. After next has been expanded, the input is equivalent to:



          if〈space token〉cat %
          else setbox0=hbox{next}maketypeboxfi


          where 〈space token〉 represents an explicit space token (one could define a control sequence that is let-equal to an explicit space token and use it instead of 〈space token〉, see footnote 1 below). Now, TeX has two non-expandable tokens following the if: a space token and a c character token (of category 11 under the normal catcode regime). So, the outcome of the if can be decided: it is false because the character codes of a 〈space token〉 and of c differ, so TeX will skip to the else clause.



          There is no big problem so far, though we are going to box the whole cat at once instead of each character separately (c, a, and t); but let's back up a little bit. Had we used:



          deffoobar{ cat}


          the input would have been equivalent to:



          if〈space token〉〈space token〉cat %
          else setbox0=hbox{next}maketypeboxfi


          The test would have been true and TeX would have left cat in the input stream, which is plain wrong, because we were supposed to test what we just grabbed in next, not to insert new text!



          So, the comment “assume that next is unexpandable” could be rephrased more generally, in my humble opinion, as “assume that next ultimately expands to either (1) exactly one character token or (2) exactly one chardef token or (3) a control sequence token that is let-equal to (1) or (2)”2 (the character token in (1) is necessarily non-active, because of the “ultimately”). Indeed, you can test that demobox works perfectly when next recursively expands to a single character token, as in:



          defmyspacei{myspace}
          defmyspace{space}

          noindent
          demobox{Abc defmyspacei pU gHi}


          Screenshot



          Using myspacei here gives the same result as using an explicit space token, because it recursively expands to such a token.



          Here is another example that additionally uses a control sequence that recursively expands to a non-space character token:



          defmyspacei{myspace}
          defmyspace{space}

          defmyxii{myxi}
          defmyxi{myx}
          defmyx{X}

          noindent
          demobox{Abc defmyspacei pUmyxii gHi}


          Screenshot with also a non-space character token



          Your proposal:



          def\{expandafterifxspacenext %
          ...


          would also work, as long as next has been let-equal to a space token (explicit or implicit). But it wouldn't work with input containing spaces in the form of macros like space or our myspacei macro defined above. Indeed, ifx distinguishes between character tokens and macros (see specification of ifx p. 210 of the TeXbook).



          Finally, although it would work, your replacement of endlist with end does not sound like the best coding style to me, because end is an existing TeX primitive; Knuth chose something more “unique” to mark the end of the text to be worked on. Besides, the name endlist was visibly chosen to match dolist: it is a matter of consistency. See in particular:



          defdemobox#1{setbox0=hbox{dolist#1endlist}%
          ...




          Footnotes





          1. You can define a control sequence stoken that is let-equal to an explicit space token like this:



            {def\{globalletstoken= }\ }% now, stoken is an implicit space token


            (adapted from the TeXbook p. 376). Two other ways are given in the TeXbook p. 336 (exercise 24.6):



            def\{letstoken= }\ %


            and



            def\#1\{}futureletstoken\ \%


          2. This is in particular the case when next has been let-equal to a non-active character token—which is, I think, the case Knuth had in mind when he used the word “unexpandable” (indeed, a non-active character token, or a control sequence that has been let-equal to such a token, never expands). In other words, the condition “next is unexpandable” from the comment you quoted is a sufficient condition for ensuring that the macros behave sanely, and is only a particular case of the more general condition I gave. :-)







          share|improve this answer















          For readers who don't find the line:



          def\{ifspacenext % assume that next is unexpandable


          in their TeXbook, it is in the errata published by Donald E. Knuth (“page A311”).



          Suppose you do:



          deffoobar{cat}

          noindent
          demobox{The foobar in the hat}


          After next has grabbed the foobar token, \ will expand to something equivalent to:



          ifspacenext %
          else setbox0=hbox{next}maketypeboxfi


          with next being let-equal to foobar. According to the documentation of if (TeXbook p. 209), TeX is going to expand tokens following the if until it finds two non-expandable ones. space expands to an explicit space token in one step, so TeX goes on with next (which has the same meaning as foobar at this point), because it needs one more non-expandable token. After next has been expanded, the input is equivalent to:



          if〈space token〉cat %
          else setbox0=hbox{next}maketypeboxfi


          where 〈space token〉 represents an explicit space token (one could define a control sequence that is let-equal to an explicit space token and use it instead of 〈space token〉, see footnote 1 below). Now, TeX has two non-expandable tokens following the if: a space token and a c character token (of category 11 under the normal catcode regime). So, the outcome of the if can be decided: it is false because the character codes of a 〈space token〉 and of c differ, so TeX will skip to the else clause.



          There is no big problem so far, though we are going to box the whole cat at once instead of each character separately (c, a, and t); but let's back up a little bit. Had we used:



          deffoobar{ cat}


          the input would have been equivalent to:



          if〈space token〉〈space token〉cat %
          else setbox0=hbox{next}maketypeboxfi


          The test would have been true and TeX would have left cat in the input stream, which is plain wrong, because we were supposed to test what we just grabbed in next, not to insert new text!



          So, the comment “assume that next is unexpandable” could be rephrased more generally, in my humble opinion, as “assume that next ultimately expands to either (1) exactly one character token or (2) exactly one chardef token or (3) a control sequence token that is let-equal to (1) or (2)”2 (the character token in (1) is necessarily non-active, because of the “ultimately”). Indeed, you can test that demobox works perfectly when next recursively expands to a single character token, as in:



          defmyspacei{myspace}
          defmyspace{space}

          noindent
          demobox{Abc defmyspacei pU gHi}


          Screenshot



          Using myspacei here gives the same result as using an explicit space token, because it recursively expands to such a token.



          Here is another example that additionally uses a control sequence that recursively expands to a non-space character token:



          defmyspacei{myspace}
          defmyspace{space}

          defmyxii{myxi}
          defmyxi{myx}
          defmyx{X}

          noindent
          demobox{Abc defmyspacei pUmyxii gHi}


          Screenshot with also a non-space character token



          Your proposal:



          def\{expandafterifxspacenext %
          ...


          would also work, as long as next has been let-equal to a space token (explicit or implicit). But it wouldn't work with input containing spaces in the form of macros like space or our myspacei macro defined above. Indeed, ifx distinguishes between character tokens and macros (see specification of ifx p. 210 of the TeXbook).



          Finally, although it would work, your replacement of endlist with end does not sound like the best coding style to me, because end is an existing TeX primitive; Knuth chose something more “unique” to mark the end of the text to be worked on. Besides, the name endlist was visibly chosen to match dolist: it is a matter of consistency. See in particular:



          defdemobox#1{setbox0=hbox{dolist#1endlist}%
          ...




          Footnotes





          1. You can define a control sequence stoken that is let-equal to an explicit space token like this:



            {def\{globalletstoken= }\ }% now, stoken is an implicit space token


            (adapted from the TeXbook p. 376). Two other ways are given in the TeXbook p. 336 (exercise 24.6):



            def\{letstoken= }\ %


            and



            def\#1\{}futureletstoken\ \%


          2. This is in particular the case when next has been let-equal to a non-active character token—which is, I think, the case Knuth had in mind when he used the word “unexpandable” (indeed, a non-active character token, or a control sequence that has been let-equal to such a token, never expands). In other words, the condition “next is unexpandable” from the comment you quoted is a sufficient condition for ensuring that the macros behave sanely, and is only a particular case of the more general condition I gave. :-)








          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited May 27 at 17:59

























          answered May 27 at 6:49









          frougonfrougon

          8,6651 gold badge14 silver badges27 bronze badges




          8,6651 gold badge14 silver badges27 bronze badges
















          • I just added a footnote clarifying why (presumably) Knuth used the word “unexpandable” in the comment you quoted (insofar as I can get a glimpse of what happens in Knuth's mind!).

            – frougon
            May 27 at 8:38













          • You say: "... as space is a macro ...", but this is not true, because expandafter makes space a space token.

            – Igor Liferenko
            May 27 at 8:46











          • end is used just as a token here. Knuth uses it a lot. For example, see final example in chapter 20.

            – Igor Liferenko
            May 27 at 8:49











          • space is defined in plain.tex with defspace{ }. Anything defined with def (or one of its variants) is a macro, that is the definition of a macro. If you still don't believe me, run texdef space. This outputs space: macro:-> .

            – frougon
            May 27 at 8:50











          • NO! See description of expandafter on p. 213

            – Igor Liferenko
            May 27 at 8:51



















          • I just added a footnote clarifying why (presumably) Knuth used the word “unexpandable” in the comment you quoted (insofar as I can get a glimpse of what happens in Knuth's mind!).

            – frougon
            May 27 at 8:38













          • You say: "... as space is a macro ...", but this is not true, because expandafter makes space a space token.

            – Igor Liferenko
            May 27 at 8:46











          • end is used just as a token here. Knuth uses it a lot. For example, see final example in chapter 20.

            – Igor Liferenko
            May 27 at 8:49











          • space is defined in plain.tex with defspace{ }. Anything defined with def (or one of its variants) is a macro, that is the definition of a macro. If you still don't believe me, run texdef space. This outputs space: macro:-> .

            – frougon
            May 27 at 8:50











          • NO! See description of expandafter on p. 213

            – Igor Liferenko
            May 27 at 8:51

















          I just added a footnote clarifying why (presumably) Knuth used the word “unexpandable” in the comment you quoted (insofar as I can get a glimpse of what happens in Knuth's mind!).

          – frougon
          May 27 at 8:38







          I just added a footnote clarifying why (presumably) Knuth used the word “unexpandable” in the comment you quoted (insofar as I can get a glimpse of what happens in Knuth's mind!).

          – frougon
          May 27 at 8:38















          You say: "... as space is a macro ...", but this is not true, because expandafter makes space a space token.

          – Igor Liferenko
          May 27 at 8:46





          You say: "... as space is a macro ...", but this is not true, because expandafter makes space a space token.

          – Igor Liferenko
          May 27 at 8:46













          end is used just as a token here. Knuth uses it a lot. For example, see final example in chapter 20.

          – Igor Liferenko
          May 27 at 8:49





          end is used just as a token here. Knuth uses it a lot. For example, see final example in chapter 20.

          – Igor Liferenko
          May 27 at 8:49













          space is defined in plain.tex with defspace{ }. Anything defined with def (or one of its variants) is a macro, that is the definition of a macro. If you still don't believe me, run texdef space. This outputs space: macro:-> .

          – frougon
          May 27 at 8:50





          space is defined in plain.tex with defspace{ }. Anything defined with def (or one of its variants) is a macro, that is the definition of a macro. If you still don't believe me, run texdef space. This outputs space: macro:-> .

          – frougon
          May 27 at 8:50













          NO! See description of expandafter on p. 213

          – Igor Liferenko
          May 27 at 8:51





          NO! See description of expandafter on p. 213

          – Igor Liferenko
          May 27 at 8:51













          6
















          It means what it says: only unexpandable tokens are allowed in the argument to demobox. More precisely, character tokens or unexpandable control sequences that correspond (via chardef or let) to printable characters (including spaces).



          If you try



          demobox{abc def}

          defexpandable{expandable token}

          demobox{expandable}


          you get



          enter image description here



          which is probably not what you were expecting. On the other hand, a definition like



          defexpandable{ expandable token}


          would yield something very far from the expectations.



          So the demobox macro can be used only with its argument consisting of unexpandable tokens or macros expanding to a single unexpandable token.



          Also chardef tokens are allowed, as well as implicit character tokens. However bgroup would also be problematic: compare demobox{A bgroup ABegroup} with demobox{A AB}, to see the issue.



          You might want to extend demobox in various ways, but that's not the object of the exercise.



          About your suggestion to redefine dolist to use end instead of endlist: you can do it, if you prefer. Knuth doesn't prefer it; instead he uses a control sequence that's specific to dolist processing. Note that the definition of endlist will produce an infinite loop whenever endlist is expanded (probably by a mistake in the macros using dolist), whereas end wouldn't.






          share|improve this answer


























          • Actually, the example works just fine without the defendlist{endlist}. Not sure why this def was added at all (considering the object of the exercise).

            – Igor Liferenko
            May 28 at 6:57











          • @IgorLiferenko The dolist macro can be used in other situations.

            – egreg
            May 28 at 8:25
















          6
















          It means what it says: only unexpandable tokens are allowed in the argument to demobox. More precisely, character tokens or unexpandable control sequences that correspond (via chardef or let) to printable characters (including spaces).



          If you try



          demobox{abc def}

          defexpandable{expandable token}

          demobox{expandable}


          you get



          enter image description here



          which is probably not what you were expecting. On the other hand, a definition like



          defexpandable{ expandable token}


          would yield something very far from the expectations.



          So the demobox macro can be used only with its argument consisting of unexpandable tokens or macros expanding to a single unexpandable token.



          Also chardef tokens are allowed, as well as implicit character tokens. However bgroup would also be problematic: compare demobox{A bgroup ABegroup} with demobox{A AB}, to see the issue.



          You might want to extend demobox in various ways, but that's not the object of the exercise.



          About your suggestion to redefine dolist to use end instead of endlist: you can do it, if you prefer. Knuth doesn't prefer it; instead he uses a control sequence that's specific to dolist processing. Note that the definition of endlist will produce an infinite loop whenever endlist is expanded (probably by a mistake in the macros using dolist), whereas end wouldn't.






          share|improve this answer


























          • Actually, the example works just fine without the defendlist{endlist}. Not sure why this def was added at all (considering the object of the exercise).

            – Igor Liferenko
            May 28 at 6:57











          • @IgorLiferenko The dolist macro can be used in other situations.

            – egreg
            May 28 at 8:25














          6














          6










          6









          It means what it says: only unexpandable tokens are allowed in the argument to demobox. More precisely, character tokens or unexpandable control sequences that correspond (via chardef or let) to printable characters (including spaces).



          If you try



          demobox{abc def}

          defexpandable{expandable token}

          demobox{expandable}


          you get



          enter image description here



          which is probably not what you were expecting. On the other hand, a definition like



          defexpandable{ expandable token}


          would yield something very far from the expectations.



          So the demobox macro can be used only with its argument consisting of unexpandable tokens or macros expanding to a single unexpandable token.



          Also chardef tokens are allowed, as well as implicit character tokens. However bgroup would also be problematic: compare demobox{A bgroup ABegroup} with demobox{A AB}, to see the issue.



          You might want to extend demobox in various ways, but that's not the object of the exercise.



          About your suggestion to redefine dolist to use end instead of endlist: you can do it, if you prefer. Knuth doesn't prefer it; instead he uses a control sequence that's specific to dolist processing. Note that the definition of endlist will produce an infinite loop whenever endlist is expanded (probably by a mistake in the macros using dolist), whereas end wouldn't.






          share|improve this answer













          It means what it says: only unexpandable tokens are allowed in the argument to demobox. More precisely, character tokens or unexpandable control sequences that correspond (via chardef or let) to printable characters (including spaces).



          If you try



          demobox{abc def}

          defexpandable{expandable token}

          demobox{expandable}


          you get



          enter image description here



          which is probably not what you were expecting. On the other hand, a definition like



          defexpandable{ expandable token}


          would yield something very far from the expectations.



          So the demobox macro can be used only with its argument consisting of unexpandable tokens or macros expanding to a single unexpandable token.



          Also chardef tokens are allowed, as well as implicit character tokens. However bgroup would also be problematic: compare demobox{A bgroup ABegroup} with demobox{A AB}, to see the issue.



          You might want to extend demobox in various ways, but that's not the object of the exercise.



          About your suggestion to redefine dolist to use end instead of endlist: you can do it, if you prefer. Knuth doesn't prefer it; instead he uses a control sequence that's specific to dolist processing. Note that the definition of endlist will produce an infinite loop whenever endlist is expanded (probably by a mistake in the macros using dolist), whereas end wouldn't.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered May 27 at 10:49









          egregegreg

          772k91 gold badges2013 silver badges3372 bronze badges




          772k91 gold badges2013 silver badges3372 bronze badges
















          • Actually, the example works just fine without the defendlist{endlist}. Not sure why this def was added at all (considering the object of the exercise).

            – Igor Liferenko
            May 28 at 6:57











          • @IgorLiferenko The dolist macro can be used in other situations.

            – egreg
            May 28 at 8:25



















          • Actually, the example works just fine without the defendlist{endlist}. Not sure why this def was added at all (considering the object of the exercise).

            – Igor Liferenko
            May 28 at 6:57











          • @IgorLiferenko The dolist macro can be used in other situations.

            – egreg
            May 28 at 8:25

















          Actually, the example works just fine without the defendlist{endlist}. Not sure why this def was added at all (considering the object of the exercise).

          – Igor Liferenko
          May 28 at 6:57





          Actually, the example works just fine without the defendlist{endlist}. Not sure why this def was added at all (considering the object of the exercise).

          – Igor Liferenko
          May 28 at 6:57













          @IgorLiferenko The dolist macro can be used in other situations.

          – egreg
          May 28 at 8:25





          @IgorLiferenko The dolist macro can be used in other situations.

          – egreg
          May 28 at 8:25



















          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%2f492807%2fquestion-about-exercise-11-5-in-texbook%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

          Bruad Bilen | Luke uk diar | NawigatsjuunCommonskategorii: BruadCommonskategorii: RunstükenWikiquote: Bruad

          What is the offset in a seaplane's hull?

          Slayer Innehåll Historia | Stil, komposition och lyrik | Bandets betydelse och framgångar | Sidoprojekt och samarbeten | Kontroverser | Medlemmar | Utmärkelser och nomineringar | Turnéer och festivaler | Diskografi | Referenser | Externa länkar | Navigeringsmenywww.slayer.net”Metal Massacre vol. 1””Metal Massacre vol. 3””Metal Massacre Volume III””Show No Mercy””Haunting the Chapel””Live Undead””Hell Awaits””Reign in Blood””Reign in Blood””Gold & Platinum – Reign in Blood””Golden Gods Awards Winners”originalet”Kerrang! Hall Of Fame””Slayer Looks Back On 37-Year Career In New Video Series: Part Two””South of Heaven””Gold & Platinum – South of Heaven””Seasons in the Abyss””Gold & Platinum - Seasons in the Abyss””Divine Intervention””Divine Intervention - Release group by Slayer””Gold & Platinum - Divine Intervention””Live Intrusion””Undisputed Attitude””Abolish Government/Superficial Love””Release “Slatanic Slaughter: A Tribute to Slayer” by Various Artists””Diabolus in Musica””Soundtrack to the Apocalypse””God Hates Us All””Systematic - Relationships””War at the Warfield””Gold & Platinum - War at the Warfield””Soundtrack to the Apocalypse””Gold & Platinum - Still Reigning””Metallica, Slayer, Iron Mauden Among Winners At Metal Hammer Awards””Eternal Pyre””Eternal Pyre - Slayer release group””Eternal Pyre””Metal Storm Awards 2006””Kerrang! Hall Of Fame””Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Bullet-For My Valentine booed at Metal Hammer Golden Gods Awards””Unholy Aliance””The End Of Slayer?””Slayer: We Could Thrash Out Two More Albums If We're Fast Enough...””'The Unholy Alliance: Chapter III' UK Dates Added”originalet”Megadeth And Slayer To Co-Headline 'Canadian Carnage' Trek”originalet”World Painted Blood””Release “World Painted Blood” by Slayer””Metallica Heading To Cinemas””Slayer, Megadeth To Join Forces For 'European Carnage' Tour - Dec. 18, 2010”originalet”Slayer's Hanneman Contracts Acute Infection; Band To Bring In Guest Guitarist””Cannibal Corpse's Pat O'Brien Will Step In As Slayer's Guest Guitarist”originalet”Slayer’s Jeff Hanneman Dead at 49””Dave Lombardo Says He Made Only $67,000 In 2011 While Touring With Slayer””Slayer: We Do Not Agree With Dave Lombardo's Substance Or Timeline Of Events””Slayer Welcomes Drummer Paul Bostaph Back To The Fold””Slayer Hope to Unveil Never-Before-Heard Jeff Hanneman Material on Next Album””Slayer Debut New Song 'Implode' During Surprise Golden Gods Appearance””Release group Repentless by Slayer””Repentless - Slayer - Credits””Slayer””Metal Storm Awards 2015””Slayer - to release comic book "Repentless #1"””Slayer To Release 'Repentless' 6.66" Vinyl Box Set””BREAKING NEWS: Slayer Announce Farewell Tour””Slayer Recruit Lamb of God, Anthrax, Behemoth + Testament for Final Tour””Slayer lägger ner efter 37 år””Slayer Announces Second North American Leg Of 'Final' Tour””Final World Tour””Slayer Announces Final European Tour With Lamb of God, Anthrax And Obituary””Slayer To Tour Europe With Lamb of God, Anthrax And Obituary””Slayer To Play 'Last French Show Ever' At Next Year's Hellfst””Slayer's Final World Tour Will Extend Into 2019””Death Angel's Rob Cavestany On Slayer's 'Farewell' Tour: 'Some Of Us Could See This Coming'””Testament Has No Plans To Retire Anytime Soon, Says Chuck Billy””Anthrax's Scott Ian On Slayer's 'Farewell' Tour Plans: 'I Was Surprised And I Wasn't Surprised'””Slayer””Slayer's Morbid Schlock””Review/Rock; For Slayer, the Mania Is the Message””Slayer - Biography””Slayer - Reign In Blood”originalet”Dave Lombardo””An exclusive oral history of Slayer”originalet”Exclusive! Interview With Slayer Guitarist Jeff Hanneman”originalet”Thinking Out Loud: Slayer's Kerry King on hair metal, Satan and being polite””Slayer Lyrics””Slayer - Biography””Most influential artists for extreme metal music””Slayer - Reign in Blood””Slayer guitarist Jeff Hanneman dies aged 49””Slatanic Slaughter: A Tribute to Slayer””Gateway to Hell: A Tribute to Slayer””Covered In Blood””Slayer: The Origins of Thrash in San Francisco, CA.””Why They Rule - #6 Slayer”originalet”Guitar World's 100 Greatest Heavy Metal Guitarists Of All Time”originalet”The fans have spoken: Slayer comes out on top in readers' polls”originalet”Tribute to Jeff Hanneman (1964-2013)””Lamb Of God Frontman: We Sound Like A Slayer Rip-Off””BEHEMOTH Frontman Pays Tribute To SLAYER's JEFF HANNEMAN””Slayer, Hatebreed Doing Double Duty On This Year's Ozzfest””System of a Down””Lacuna Coil’s Andrea Ferro Talks Influences, Skateboarding, Band Origins + More””Slayer - Reign in Blood””Into The Lungs of Hell””Slayer rules - en utställning om fans””Slayer and Their Fans Slashed Through a No-Holds-Barred Night at Gas Monkey””Home””Slayer””Gold & Platinum - The Big 4 Live from Sofia, Bulgaria””Exclusive! Interview With Slayer Guitarist Kerry King””2008-02-23: Wiltern, Los Angeles, CA, USA””Slayer's Kerry King To Perform With Megadeth Tonight! - Oct. 21, 2010”originalet”Dave Lombardo - Biography”Slayer Case DismissedArkiveradUltimate Classic Rock: Slayer guitarist Jeff Hanneman dead at 49.”Slayer: "We could never do any thing like Some Kind Of Monster..."””Cannibal Corpse'S Pat O'Brien Will Step In As Slayer'S Guest Guitarist | The Official Slayer Site”originalet”Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Kerrang! Awards 2006 Blog: Kerrang! Hall Of Fame””Kerrang! Awards 2013: Kerrang! Legend”originalet”Metallica, Slayer, Iron Maien Among Winners At Metal Hammer Awards””Metal Hammer Golden Gods Awards””Bullet For My Valentine Booed At Metal Hammer Golden Gods Awards””Metal Storm Awards 2006””Metal Storm Awards 2015””Slayer's Concert History””Slayer - Relationships””Slayer - Releases”Slayers officiella webbplatsSlayer på MusicBrainzOfficiell webbplatsSlayerSlayerr1373445760000 0001 1540 47353068615-5086262726cb13906545x(data)6033143kn20030215029