Solitaire is a method for encrypting messages by hand. Reading it though, the only advantage the Solitaire has over a one time pad is that it can encrypt longer messages. It requires a new, random key for each message, just like OTP. In fact, schneir even recommends you keep messages short, limiting the length advantage.
However, the fact that a key is stored in a deck does limit the length quite a bit. A deck can only hold about 225 bits of information. OTP can only send messages smaller than the key. If you are encoding your message using, say, ASCII, that's only about 28 characters.
However, English has been empirically measured to have only 1 bit of entropy per character. That means that, after compression, you could send a 225 character message!
My question is, what are some methods to compress English that you can do by hand? It should be able to work on short messages, although you may assume the sender and receiver have some sort of shared state that could help. This state is allowed to be calculated using a computer before hand.
EDIT: As a clarification, it should be possible to compress any message, and get the exact message back when you decompress (i.e. we aren't considering lossy compression).
One method I thought of was to create a Huffman encoding where the symbols are English words, and provide the encoder and decoder with a dictionary for the codes of each word. Perhaps even better and more general would be a something based on finite state machines. The encoder and decoder would have separate state machines. To encode a message, it passed through the encoding machine which then spits out a code. To decode, the code is passed through the decoding machine which then spits out the original message. (Note that code here means "compressed message", not "encrypted message". Encryption is a separate process.) The finite state machines could be found using a computer, presumably, and represented via a large (book sized) table.