Hi Mark,
The Zip example (without publish), does two isolated subscription to the the numbers observable. in this case, because the numbers observable is cold, it will generate the entire sequence twice, meaning that the increment of i will happen 10 time, 5 times to generate the sequence for the first subscription, and 5 times for the second subscription. therefore, the "zipping" in each iteration will occur for pairs of (i+1,i+2) where i is the initial value in the iteration.
The Publish operator turns the cold observable to a hot one, so all subscription to the hot observable will share the same sequence. The selector function that is passed to the Publish operator, receives the hot observable and can use it and subscribe to it multiple times (and all of them will share the sequence), the returned observable from the selector function is the one that will be returned from the Publish operator.
So this time, in Zip operator, is "zipping" the same element that is coming from the two subscriptions, therefore the pairs are of the same element (i,i).
I hope i helped clearing it now
