En español, la raya (—) es un carácter parentético, es decir, que, al igual que las comillas o el paréntesis, va pegado a las palabras que hay en su interior.
El problema es que en inglés no sucede así.
Por eso, a pesar de que las normas Unicode sobre cómo dividir palabras a final de línea en distintos idiomas toman en consideración esta característica del español, los algoritmos incluidos en las mismas normas se las pasan por el arco del triunfo. Esto tiene relevancia después a la hora de maquetar archivos, pues ni los procesadores de texto de Microsoft, ni los derivados de OpenOffice (como LibreOffice), ni los navegadores, ni los lectores de libros electrónicos .epub suelen respetar esta característica, que en español es necesaria para distinguir una raya de cierre de una raya de diálogo.
Esta macro de Visual Basic para PowerPoint intentaba solucionar ese problema insertando un carácter de “unión invisible” antes de cada raya que vaya seguida de espacio.
Sin embargo, no funcionó demasiado bien, porque PowerPoint no respeta el carácter “unión invisible” si aparece seguido de una raya. Con el signo “restar” sí funcionaría, pero el signo “restar” tiene otra función semántica distinta.
Attribute VB_Name = "WordJoinerPowerPoint" 'Inserts Word Joiner AFTER em-dash if and only a space appears BEFORE em-dash. ' Sub EmDashWordJoin() Dim Sl As Slide Dim Sh As Shape Dim tf As TextFrame Dim f As Long, status As Boolean For Each Sl In ActivePresentation.Slides For Each Sh In Sl.Shapes If Sh.HasTextFrame Then Set tf = Sh.TextFrame If tf.HasText Then f = 1 Do Select Case Mid(tf.TextRange.Text, f, 1) Case " " status = True Case "—" 'em-dash If status Then '&h2060: Unicode Word Joiner '&hfeff: Unicode Zero Width No Break Space (ZWNBS) tf.TextRange.Text = _ Left(tf.TextRange.Text, f) + _ ChrW(&HFEFF) + _ Mid(tf.TextRange.Text, f + 1) Debug.Print "Word Join inserted:" & _ Left(tf.TextRange.Text, f) + _ "·" + _ Mid(tf.TextRange.Text, f + 1) End If status = False Case Else status = False End Select f = f + 1 Loop Until f > Len(tf.TextRange.Text) End If End If Next Next End Sub 'Removes Word Joiner. ' Sub RemoveWordJoin() Dim Sl As Slide Dim Sh As Shape Dim tf As TextFrame Dim f As Long, status As Boolean For Each Sl In ActivePresentation.Slides For Each Sh In Sl.Shapes If Sh.HasTextFrame Then Set tf = Sh.TextFrame If tf.HasText Then f = 1 Do Select Case Mid(tf.TextRange.Text, f, 1) Case " " status = True '&h2060: Unicode Word Joiner '&hfeff: Unicode Zero Width No Break Space (ZWNBS) Case ChrW(&H2060), ChrW(&HFEFF) tf.TextRange.Text = _ Left(tf.TextRange.Text, f - 1) + _ Mid(tf.TextRange.Text, f + 1) Debug.Print "Word Join removed:" & _ tf.TextRange.Text End Select f = f + 1 Loop Until f > Len(tf.TextRange.Text) End If End If Next Next End Sub