I've used the following expression to selectively apply a "proper" format to text:
If ( Exact ( TextField ; Lower ( TextField ) ) or Exact ( TextField ; Upper ( TextField ) ) ; Proper ( TextField ) ; TextField )
IF the text is all lower case or all upper case, it applies the proper format, but leaves things unchanged is some capitalization has been applied to the text by the user. It's not perfect and you may want to just do an "exact" test comparing the text to all lower case and not also to all Upper case, but be aware that it's easy for data entry personnel to enter a bunch of text all caps with the caps lock key down.
You can also use this approach with a conditional format expression instead of a calculation and leave the actual text input into the field unchanged--only changing how it is displayed on a given layout.
Thanks for the tip, Phil, but it doesn't look like it works quite good enough for me to use. If you enter "123 fake street" it will change as we would want to 123 Fake Street, but if you enter "123 Fake street" , the correction to capilzation Street will not happen on commit. (I replaced your "TextField" to "Self" and kept my TextFormatRemove in my implementation.
That is correct, but there is no option that will work perfectly in every situation here. The assumption is that this method catches cases where a user forgets to apply any capitalization but it will not change the data entered if some capitalization was used and some omitted.
Also consider such issues as getting the correct capitalization for names like: MacDaniels.
a script or recursive custom function could loop through the text and use this logic while formatting one word at a time however.