Translation invariance in max-pooling and cascading with convolutional layer
The idea of complex cell layer is to "pool" a set of simple cells and acquire the same data from those simple cells (e.g invariant translation, rotation invariant, etc). One nice illustration is the computational model of Neocognitron  https://youtu.be/Qil4kmvm2Sw?t=6m9s

As for the example of translating 2x2 and 3x3 matrix by one pixel in deeplearning.net, I think one possible explanation is that the Pooling map returns the same value for the subsequent Convolution map. Considering the following 4x4 image with our significant data in 2x2 region (row = 2, col = 2) to (3,3):

0 0 0 0 
0 1 6 0 
0 2 3 0 
0 0 0 0 

The Max-Pooling map always look at the region (2,2) and (3,3) and it returns 6. If our data were translated (moved) one pixel, there would be 8 different ways to do that. Among those there are 3 ways that keep region ((2,2); (3,3)) has 6 as the maximum value:

drow = 1, dcol = 0 
0 0 0 0 
0 0 0 0 
0 1 6 0 
0 2 3 0 

drow = 0, dcol = -1 
0 0 0 0 
1 6 0 0 
2 3 0 0
0 0 0 0 

drow = 1, dcol = -1 
0 0 0 0 
0 0 0 0 
1 6 0 0 
2 3 0 0

That said, if our data is represented by the maximum value then the recognition will work for all those 3 cases. 

When applying the same translation process (by 1 pixel) for 3x3 matrix 

1 2 3 
4 5 6 
7 8 9 

The the maximum value at the corner (1, 3, 7, 9) will be retained in 3 translations, the value in the middle of each edge (2, 4, 6, 8) will be retained in 5 translations. The simple cells are responsible for line/edge detection, so probably the center position (5) is left out. 

That's how I understand translation invariance. I'm not completely sure though, since the author stated that "[...]produce exactly the same output at the convolutional layer." It would be great if the author of deeplearning.net could explain a bit more on that.