TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Discl.: I have been using LaTeX for many years, but I am a beginner on the more advanced macro stuff.

For a specific hack of a latex document of mine, I want to override the use of \hrule within a command provided by a package I am using. Specifically I want to redefine \hrule to do nothing, perform the command of the package, and then restore \hrule to its previous definition.

Hence I want to do something along the lines of this:


Which gives me the error:

! Use of \hrule doesn't match its definition.

What is the correct approach to achieve this?

-- Edit 1 (more specific error) --

I tried the following, as suggested by Herbert:


which gives me this error

! Use of \hrule doesn't match its definition.
\@packagespecficcommand...skip -\topskip \fi \hrule \@height 
                                                   0.35mm\noindent \advance \...
share|improve this question
Welcome to TeX.sx! A tip: You can use backticks ` to mark your inline code as I did in my edit. – hpesoj626 Mar 14 '13 at 13:27
I don’t know a \hrule macro that accepts three parameters delimited in ( and ). Do you maybe mean the LaTeX \rule macro? – Qrrbrbirlbel Mar 14 '13 at 13:28
\let\hrule\relax, maybe? – Keks Dose Mar 14 '13 at 13:32
@KeksDose Won't work because \hrule is used as \hrule height 2pt etc., and if \hrule itself is a no-op, the arguments will remain. – Ryan Reich Mar 14 '13 at 13:35
The only way I see is redefining the macros in the package that use \hrule. As David Carlisle explains, \hrule is a primitive command with a very peculiar syntax and is used in many LaTeX constructs, which will most likely break if \hrule is redefined. – egreg Mar 14 '13 at 14:35
up vote 5 down vote accepted

As suggested in the comments all sort of errors are bound to happen here. hrule even when let to \relax, will still leave its argument in the stream. For example the \textunderscore macro only takes a width argument (the height defaults to the TeX default) and elsewhere it might even have other arguments such as \hfill in the definition of \hrulefill. See the example below.

 \leavevmode \kern.06em\vbox{\hrule\@width.3em}}



a\textunderscore b


It will be preferable to rather set it's arguments to 0pt i.e., \@width etc if you know them and perhaps do all these within a group.

share|improve this answer

You really don't want to do this.

Firstly as has been noted in comments \hrule does not take {} or () delimited arguments, secondly if you do redefine \hrule you not only change the behaviour of an explicit \hrule in the document (which by the way isn't correct LaTeX syntax anyway) but you also change (and most likely break) the behaviour of every latex command that uses \hrule internally. These include at least \vspace \hrulefill \textunderscore \textvisiblespace \frame \framebox \fbox \hline \cline \oval \footnoterule

If I included all the commands and environments that depended on \vspace the list would be a lot longer.

share|improve this answer

Your Answer


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.