It's not well documented, but here is the logic :
1/ When you use multi-line, there is theorically no need to change \n to newline, because you can actually use a real newline if you need. Furthermore, since PlantUML is used in software management, it could be useful that PlantUML does not interpret \n in that case:
@startuml
:Here is the line executed:
fprintf("hello\n", %s);
@enduml
2/ In a single line, since there are no other way, we interpret \n as a real newline
Now I understand that this may sound confusing, and that may be an issue, especially for preprocessing.
Maybe you can tell us more about what you are trying to do with the preprocessor.
I also think that we should have ignore \n in all cases and we should propose a non-standard way for newline (something like <u+newline> for example) so that the PlantUML syntax would not interfere with all other syntaxes. What do you think about it ?