I mis-read the question the second time I read it. I started showing an example of roads but re-read and changed to polys. I hope you can see the jist and apply to lines as well.
If not leave a comment and I will edit.
You probably want to define several labeling definitions in the label dialog "define classes of features and label each class differently" pulldown.
I have maplex which makes this easy.
Without maplex you can do it by creating an sql on the length.
- if you don't already have one create a field to hold the area (length for lines) value and calculate that into the field.
- (easy way to start and visualize) define classes in the symbology for different size areas e.g. 1 - 1000, 1001 - 8000, 8000 - 50000.
I always change the decimal format as shown.
This will show only the number of decimals you want.
- change the labeling to "define classes of features..." and select the "get symbol classes" button (this also defines the sql query to match the symbology).
- now you can select each class and rename/modify the labeling for super small, small and large polys to have differing styles and settings for the labels.
Note: you can set the feature weight high for polys (or lines) you want to label "outside/away" and low for polys (or lines) big enough to hold the label (label on line).
Also setting an offset will force the small polys (lines) to label some set distance away from the poly (line).
Allowing more air around a group of small polys (lines).
As mentioned in the link by mapperz, you should set the leader tolerance to something much smaller if you want the leader to show.
If you have access to maplex . I usually set my label minimum feature to something that is reasonable for the scale. (will keep slivers from labeling)