From TeX by Topic, p. 111:

For certain applications, however, it is inconvenient that some of the plain macros are outer, in particular macros such as \newskip. One remedy is to redefine them, without the `outer' option, which is done for instance in LaTeX, but cleverer tricks are possible.

What are examples of such tricks for using \outer macros where they are not usually allowed?

  • 2
    'Don't use them' ;)
    – Joseph Wright
    Mar 19, 2020 at 11:11

6 Answers 6


As egreg said, the standard way is with \csname: as long as there is no \outer token at the time of the definition, you are safe.

So another possibility is, in a group, make the macro non-outer, define your macro, and then reset everything:


The problem with this version is that if you need to pass the \outer macro as argument to an auxiliary, you can't. A handier version is to define a non-outer wrapper to the \outer macro, then you can use it freely:


The standard trick is \csname:

  \csname newdimen\endcsname#1%

Or \noexpand:

\edef\myproclaim#1#2\endmyproclaim{\noexpand\proclaim #1. \ignorespaces #2\par}

This is better syntax.

\proclaim Theorem.
This is worse syntax.


enter image description here

  • If you exchange the words better <-> worse in your example, I'll agree with you.
    – wipet
    Apr 12 at 8:42
  • @wipet Sorry, you’ll never convince me.
    – egreg
    Apr 12 at 12:16
  • It was not in my interest. I only noted the case where I would agree.
    – wipet
    Apr 12 at 16:26

The famous \cleartabs, \settabs and \+ macros from plain.tex show one such trick (TeXbook p. 354):

\let\+=\relax % in case this file (plain.tex) is being read in twice
\def\sett@b{\ifx\next\+ \let\next=\relax % turn off \outerness


  1. \let\+=\relax is done before defining \sett@b in case \+ would already be an \outer token (otherwise, the \+ token in the replacement text of \sett@b would cause an error when \sett@b is defined).

  2. When the \ifx\next\+ test is true during normal usage of \settabs in the document, \next is an \outer token since in normal usage, \+ is \outer. Thus, Knuth does \let\next=\relax before redefining \next with \def\next{\afterassignment\s@tt@b\let\next}, otherwise the \next token at the end of the replacement text in this definition would cause an error.

  • +1 I love the irony ...
    – wave
    Mar 20, 2020 at 6:22
  • Regarding “famous”? Well, these macros are famous for being the most difficult to understand in plain.tex. :)
    – frougon
    Mar 20, 2020 at 8:19
  • 2
    no, just the fact that Knuth himself had to get rid of his own \outer definition due to the inconveniences coming along with it :D
    – wave
    Mar 20, 2020 at 8:30
  • Ah, that way. :-) (Security is almost always antagonist to convenience, you know... for some special TeXish definition of security here)
    – frougon
    Mar 20, 2020 at 8:35

For luatex, there is

\suppressoutererror = 1

which makes the entire issue go away.

You can use it globally or just locally in a group while you make the required definitions.


As already pointed out in egreg's answer:

If \outer-tokens are "hit" by \noexpand, they will be turned into \relax (only) for the next expansion:


\outer\def\myoutermacro{My outer macro's definition.}




% This does not work:
% \FirstOfOne{\myoutermacro}.
% These do work:





Use this to redefine an outer definition, without repeat its definition:


To make it into a macro definition:


The TikZ macro generated by dpic (a troff pic compatible drawing program, often used by Circuit_macro package), assumes \newdimen is the LaTeX version non outer definition, but to use the output with plain TeX, this can be used to fix the problem.

You must log in to answer this question.

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