30

To change the shaded color of the \rule{...}{...} command, one solution is

\textcolor‎{‎blue‎}{\rule{2cm}{2cm}}‎

but I want to know how can I directly change the color of this command globally?

Sisabe
  • 3,351

2 Answers2

29

You could do

\makeatletter
\let\old@rule\@rule
\def\@rule[#1]#2#3{\textcolor{blue}{\old@rule[#1]{#2}{#3}}}
\makeatother

But it may be better to instead define a new \colorrule command and use that instead, as you may find \rule is used in unexpected places so if you redefine it you may be changing more than you want to change.


If you need to override this sometimes it's probably better to use a colour such as rulecolor rather than blue that you can (re)define when needed:

enter image description here

\documentclass{article}

\usepackage[dvipsnames]{color}

\makeatletter
\let\old@rule\@rule
\def\@rule[#1]#2#3{\textcolor{rulecolor}{\old@rule[#1]{#2}{#3}}}
\makeatother

\definecolor{rulecolor}{named}{Blue}

\usepackage{color}

\begin{document}

\rule{1cm}{1cm}

\bigskip

\rule{.1cm}{1cm}

\bigskip

{\definecolor{rulecolor}{named}{Red}\rule{1cm}{1cm}}

\bigskip

\rule{1cm}{1cm}


\end{document}
David Carlisle
  • 757,742
  • Could you please tell me where I can find the original definition of the rule command? I'm just curious about it. – Sisabe Dec 29 '12 at 16:45
  • I got it from latex.ltx \def\rule{@ifnextchar[@rule{@rule[\z@]}} \def@rule[#1]#2#3{% \leavevmode \hbox{% \setlength@tempdima{#1}% \setlength@tempdimb{#2}% \setlength@tempdimc{#3}% \advance@tempdimc@tempdima \vrule@width@tempdimb@height@tempdimc@depth-@tempdima}} – David Carlisle Dec 29 '12 at 17:09
  • So where is the definition of the black color? Why doesn't this definition have any definition for the black color? – Sisabe Dec 29 '12 at 21:16
  • 2
    TeX itself has no knowledge of colour, rules and font cgyphs are just black and white, colour is implemented by telling the ps (or pdf or other) driver separate;y to switch the current colour) A TeX rule is not really "black" it is just a rule. – David Carlisle Dec 29 '12 at 22:15
  • A problem with this implementation is that if the user wants to change color to say red (from blue) for a single rule, on a case-by-case basis, the \textcolor{red}{\rule{...}{...}} no longer works. – Nicholas Hamilton Dec 30 '12 at 04:15
  • @ADP true but you could locally redefine the colour, see updated answer. – David Carlisle Dec 30 '12 at 13:34
  • 1
    LaTeX is so fiddly sometimes, makes me want to use notepad and hand a report to someone in plain text. – Nicholas Hamilton Dec 30 '12 at 13:39
18

The easiest alternative is:

    \textcolor{blue}{\rule{2cm}{2cm}}

If you want to define your own command, you can put this in the preamble or latter to change the color as you go.

    \newcommand{\myRule}[3][black]{\textcolor{#1}{\rule{#2}{#3}}}

and use e.g.:

    \myRule{1cm}{1cm}

    \myRule[red]{1cm}{1cm}

    \myRule[blue]{1cm}{1cm}

And if you want to fix the color throughout your document, try:

\newcommand{\myRule}[3]{%
    \textcolor{red}{\rule{#2}{#3}} %change red to blue, green black whatever.
}