10

Is there an analogue of \ignorespaces which will also ignore the following \pars?

3 Answers 3

8

Here two macros which either ignore all spaces and implicit paragraphs (empty separation line) or also explicit \par macros. Both are based on the fact that \@ifnextchar, which is used to look ahead, also consumes optional spaces before reading the next token. This safes the usage of \ignorespaces. In the first case that token is irrelevant and \@ifnextchar is just use to get the functionality of \ignorespaces but allow us to put code behind it once the spaces are gone.

I came up with this solution while thinking about how to optimize Leo's answer for my applications.

\documentclass{article}

\makeatletter
\def\ignorespacesandimplicitepars{%
  \begingroup
  \catcode13=10
  \@ifnextchar\relax
    {\endgroup}%
    {\endgroup}%
}

\def\ignorespacesandallpars{%
  \begingroup
  \catcode13=10
  \@ifnextchar\par
    {\endgroup\expandafter\ignorespacesandallpars\@gobble}%
    {\endgroup}%
}

\makeatletter

% Test cases
\let\ignorespacesandpars\ignorespacesandimplicitepars
%\let\ignorespacesandpars\ignorespacesandallpars

\begin{document}

\def\test#1{#1\ignorespacesandpars}

\test{testa}    \test{testb}




\test{testc}   
\test{testd}

\test{teste}   

\par
\test{testf}   

\end{document}
2
\documentclass{minimal}

\makeatletter
\begingroup
\catcode13=12%
\gdef\gobble@ignorespacesandpars#1{\ignorespacesandpars}%
\gdef\ignorespacesandpars{%
  \catcode13=12%
  \@ifnextchar^^M{\gobble@ignorespacesandpars}{\catcode13=5}}%
\endgroup
\makeatletter

\begin{document}

\def\test#1{-#1-\ignorespacesandpars}

foo\test{and} bar

foo\test{and}


bar

foo bar
\end{document}

Result:

foo-and-bar
foo-and-bar
foo bar
2
  • NOTE: This does nothing with \par, but ignores endlines. Explicit \par's are not ignored. I think it is what we usually need.
    – Leo Liu
    Jul 15, 2011 at 5:25
  • Nice, I actually might need this as well for the standalone class to ignore implicit paragraphs at the beginning. Two notes: Don't write {\catcode13=5} but {\catcode13=5 } to terminate the number, otherwise if the next paragraph starts with a number then this is also consumed I think. I personally would use grouping to keep the catcode change local, but you require an extra macro for then. Jul 15, 2011 at 6:56
2
\def\ignorepar{\penalty 10001 \penalty 10003 
   \def\par{\ifnum\lastpenalty=10003 \unpenalty \ifnum \lastpenalty=10001 \unpenalty 
            \else \endgraf \fi \else \endgraf \fi \let\par\endgraf}\ignorespaces}

Note: You may take any penalties more than 10000. The 10001 and the 10003 is choosen because I believe that the probability that the 10001 and 10003 are usually found in a row is very low.

More simple case:

\def\ignorepar{\penalty 12674 \def\par{\ifnum\lastpenalty=12674 \unpenalty \else \endgraf \fi \let\par\endgraf}\ignorespaces}

Edit: no fail if there're more than one blank lines.

\def\ignorepar{\penalty 12674 
   \def\par{\ifnum\lastpenalty=12674 \else \endgraf \let\par\endgraf \fi}\ignorespaces}
2
  • Funny solution. But it fails if there're more than one blank lines.
    – Leo Liu
    Jul 15, 2011 at 11:45
  • @Leo Liu. I fixed. Jul 15, 2011 at 12:03

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .