Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I see that the code in many packages and examples contains percent signs % at the end of (many) lines. What are they used for? Do they affect the parsing of those lines?

share|improve this question
    
Illustration of a potential problem that could arise if one is not careful: Tex Capacity Exceeded (if remove % after use of macro). –  Peter Grill Nov 21 '12 at 20:42

4 Answers 4

up vote 115 down vote accepted

The short answer is what others have said, % starts a comment that goes to the end of the line. The normal effect is that it doesn't insert the space (or a \par) from the newline.

The longer answer is that as TeX parses its input, it reads the input file line by line. It strips off tailing whitespace (including any carriage return and newline) and then appends a character corresponding to the number in the \endlinechar register (provided it isn't -1 or greater than 255). By default, the value is 13 which corresponds to an ASCII carriage return. (TeX denotes this by ^^M.) You can change this register to be any value.

Unless the category codes have been changed (e.g., by the \obeylines macro), ^^M has category code 5, or end of line. When TeX reaches an end of line character, it discards the rest of the line and does one of three things: nothing, insert a space token, or insert a \par token, depending on what state TeX was in (S, M, or N, respectively).

So what does this have to do with %? Well, since the comment character causes TeX to ignore the rest of the input line, the end of line character that got appended gets ignored too.

This can frequently be important when playing around with category codes of ^^M (again, using \obeylines or similar).

The long answer is contained in Chapter 8 of The TeXbook.

One final use that no one has mentioned is that it is sometimes necessary for the line to end with a space character and not a end of line character. One example is that a backslash followed by a space is different than a backslash followed by a newline:

\show\ 
\show\ %

In the first line, there's a space following the \, but it'll get stripped off as described so what you get instead \^^M as you can see by what TeX prints out.

> \^^M=macro:
->\ .

That is, \^^M is a macro that expands to a control space: . In the second case, the comment prevents the space from being stripped off and the end of line char is ignored. TeX prints out the following.

> \ =\ .

That is, is a TeX primitive (see control space in either The TeXbook or TeX by Topic).

share|improve this answer
    
1. I thought that a percent sign also swallows all initial whitespace from the next line? 2. When writing macros, in which situations would one (broadly speaking) want to end lines with a percent sign? (I know someone might be tempted to answer "whenever you don't want a whitespace there", but I'm hoping for a list or a pointer to a list of common pitfalls and traps.) –  Lover of Structure Sep 12 '12 at 18:56
5  
@user14996 -- a % only swallows the end-of-line character. tex itself in most cases is what swallows (rather ignores) spaces at the beginning of a line; it's possible to turn this off, with, e.g., \obeyspaces, and this is very useful when quoting blocks of code, to preserve meaningful indentation. –  barbara beeton Sep 28 '12 at 18:40
3  
@user14996 -- it's true that a % causes (la)tex to ignore whatever comes after on that line, including, of course, the line break. but it's tex itself that ignores spaces at the beginning of a line, and a totally blank line (no % allowed, so that the line break can be seen) will be recognized as a paragraph break, equivalent to \par. the sources you cite are mistaken. and regarding \obeyspaces, that's defined in plain.tex and in the texbook, p.352. i'm not familiar with \obeywhitespace, and don't find it in my trusted collection of reference books. –  barbara beeton Sep 29 '12 at 19:06
2  
@user14996 -- line-initial whitespace is preserved by (la)tex within most "verbatim" environments. when a new command is being defined within such an environment, spaces must not be input at the beginnings of lines to make the definition easier for someone to read (usually a polite thing to do, as well as being helpful when one has to diagnose problems); such spaces will be carried into the output. –  barbara beeton Oct 7 '12 at 11:22
2  
@user14996 -- most "ordinary" users should feel free to use line-initial whitespace to make input easier to comprehend. the only time it's really necessary to "be careful" is in verbatim-type environments, especially when defining commands to be used in such environments. with this one important exception, line-initial whatespace, used consistently, is generally a good thing. –  barbara beeton Oct 9 '12 at 17:46

You already got lots of answers. You can also just experiment yourself:

\documentclass{article}
\begin{document}
Hello%
world!
\end{document}

Try compiling this with and without the %. Then you see yourself that the % makes the space produced by the newline disappear. (Note that you'll still get the space if you write Hello % with a space before the % – try it out!) All the details are given in TH's great answer.

share|improve this answer

When I was starting out with TeX, I have read many times that the percent sign "swallows" all the whitespace after it. Whitespace includes spaces, tabs, and linebreaks.

share|improve this answer
5  
@Kit -- actually, a percent sign swallows everything that follows it, not just whitespace. so it can also be used as a really convenient mechanism to insert by-line comments in macro code (and other input). –  barbara beeton Oct 12 '12 at 20:39

A percent sign, %, allows to end a line without generating a space character -- very useful when writing macros.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.