
ContinuoCómo escribir abreviaturas con espacio entre letras (alemán) automáticamenteyhttp://tex.stackexchange.com/a/134856, algunos de nosotros tendemos a componer un espacio habitual o reducido en abreviaturas y escribir, por ejemplo,
d.\@ h, d.\ h., d.\,h., z.\@ B, z.\ B, z.\,B.
Aunque DIN 5008:2011 (ahora reemplazada; ¿alguien puede consultar una actualización?) escribe allí un espacio irrompible habitual sin mencionar ningún cambio de ancho, el ejemplo z.°B.
que proporcionan está escrito en una fuente monoespaciada. Sin embargo, usamos mucho más a menudo una fuente proporcional, por lo que probablemente también consideraríamos mejor (como mucha gente aquí en TeX.SE) disminuir ligeramente el ancho del espacio irrompible dentro de la abreviatura. Algunas personas dicen que debería tener la mitad del ancho del espacio normal; cf.http://www.master-bachelor-korrektur.de/abstaende.php.
Usando cmr10 con una longitud de espacio de 3,33 puntos, obtenemos
d.\kern1.665pt h., z.\kern1.665pt B.,
que está lo suficientemente cerca de
d.\kern.16667em h., z.\kern.16667em B.
o
d.\,h., z.\,B.
en modo texto. Alternativamente, puede tomar algún otro valor en el intervalo [min{espacio fino, medio espacio}, espacio regular[ si prefiere estar más cerca de DIN5008:2011; el valor exacto probablemente no importe mucho para el objetivo de la pregunta.
Ahora bien, cuando se escribe realmentelotesde texto, tarde o temprano te topas con dos cuestiones:
A. con ancho fijo\kern
número, sus abreviaturas a veces parecen demasiado anchas o demasiado estrechas en comparación con el resto de la línea, y
B. en columnas estrechas, a veces le gustaría evitar que el texto llegue al margen derecho o que la última línea de un párrafo termine demasiado vacía o que las palabras se separen con guiones desfavorables en otras partes del párrafo.
El problema A se puede resolver agregando componentes de estiramiento y reducción al espacio intraabreviatura, y el problema B introduciendo una penalización no máxima:
d.\penalty5000\hskip.16667em plus.08333em minus.08333em h., z.\penalty5000\hskip.16667em plus.08333em minus.08333em B.
Esto plantea dos preguntas:
Arriba, 5000 es un valor surgido de la nada, siendo el 50 % de
\@M
sin que podamos explicar por qué es\@M
/2 y no\@M
/3 o 2/3\@M
o simplemente 1. ¿Cuál sería un buen valor genérico o rango de valores (menor que Mi conjetura actual, ¿cuál es el intervalo [1, 9999]) para la penalización?Arriba, tomamos aproximadamente el 50 % del ancho natural para los atributos de estiramiento y contracción. Nuevamente, 1/2 surge de la nada; también podría haber sido cualquier otro valor en ]0,1[, como 1/3 o 2/3. ¿Alguna opción mejor informada para los porcentajes de los atributos de estiramiento y contracción?
Independiente del mismo y siguiendo el comentario de David.¿Se necesita algún cuidado especial si un punto dentro de una abreviatura va seguido de un \hskip o un \hspace?, nos gustaría evitar los valores absolutos en pt o em y, en su lugar, nos gustaría usar valores relativos a las dimensiones de fuente relacionadas con el espacio. De este modo:
- como expresar
\hskip.5*\fontdimen2 plus.5\fontdimen3 minus.5\fontdimen4
en LaTeX correctamente? Por supuesto, si no te gusta la mitad, no dudes en coger algún otro porcentaje siempre que tengas una buena explicación. Alternativamente, puede tomar otras combinaciones lineales de \fontdimen2
, \fontdimen3
y \fontdimen4
para los tres parámetros si siente la necesidad y puede explicarlo.
Respuesta1
Para 3
\fontdimen
toma dos argumentos, el número de parámetro y la fuente de donde tomar el parámetro. \font
devuelve la fuente actual para que\hskip.5\fontdimen2\font plus.5\fontdimen3\font minus.5\fontdimen4\font
Para 1
Depende de lo que intentes evitar agregando la penalización. TeX intentará encontrar saltos de línea para minimizar la maldad total, por lo que el valor en ese punto no se puede considerar de forma aislada, es necesario considerar qué sucede si el salto de línea no se toma allí; normalmente, algunos espacios en blanco se estiran para permitir un valor subóptimo. punto de interrupción para que el estiramiento incurra en un valor de maldad y debe hacer que la penalización por romper su abreviatura sea mayor que la penalización por estirar el espacio en blanco para que la penalización tenga efecto.
En la primera prueba se ve que el punto de ruptura entre !!
se evita con bastante facilidad. Se aplica si la penalización es 10, pero una penalización tan baja como 20 ya es suficiente para evitar una ruptura en ese punto.
En la segunda prueba es más difícil evitar una ruptura, en ese punto incluso la penalización máxima por no forzar de 9999 no es suficiente.
Así que no hay reglas definidas: necesitas elegir qué quieres prevenir y cuánto estás dispuesto a tolerar el mal producido por alternativas subóptimas.
\documentclass{article}
\begin{document}
3) \hskip.5\fontdimen2\font plus.5\fontdimen3\font minus.5\fontdimen4\font X
\noindent X\dotfill X
\def\test#1{\par$#1$\par
aaaaaaaaaaaaaaaaaaaaaaaaaaaa aaa a a a a a a4 a a a a a a a7 a a a a 8 aa!\penalty#1\,! bbb}
\test{-10000}
\test{10000}
\test{20}
\test{10}
\test{00}
\noindent X\dotfill X
\def\test#1{\par$#1$\par
aaaaaaaaaaaaaaaaaaaaaaaaaaaa aa aaa aaa aa aa aaaaaaaaaaaaaaaaaa7 aa!\penalty#1\,!bbb bbbbbb}
\test{-10000}
\test{10000}
\test{9999}
\end{document}
Para 2
Depende un poco de las expectativas culturales sobre la puntuación de las abreviaturas, pero probablemente permitiría menos reducir que estirar. El espacio ya es estrecho, por lo que en líneas estrechas, si permite que se reduzca a la mitad, puede parecer que no hay espacio en absoluto. Que AB se vea bien sin un espacio claramente visible depende de cómo usted (o sus lectores) esperan que se vea.
Respuesta2
No creo que quieras un salto de línea en medio de tal abreviatura, lo cual sería posible con \penalty5000
.
Puedes obtener uniformidad usando un comando:
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\abk}{m}
{
\tl_head:n { #1 } % the first letter
\exp_args:Ne \tl_map_function:nN { \tl_tail:n { #1 } } \aim_add_space:n
.\@
}
\cs_new_protected:Nn \aim_add_space:n
{
.\@\nolinebreak
\skip_horizontal:n { ( \fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font)*2/3 }
#1
}
\ExplSyntaxOff
\begin{document}
\abk{dh}
\abk{zB}
\abk{wxyz}
\makebox{word word \abk{zB} word word}
\makebox[1.3\width][s]{word word \abk{zB} word word}
\makebox[0.95\width][s]{word word \abk{zB} word word}
\end{document}
Aquí el espacio normal entre palabras se reduce a 2/3, utilizando una expresión de salto. Experimente con el factor.
Para que esté completo, el comando puede verificar si \spaceskip
es distinto de cero y usarlo en caso de que lo sea.
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\abk}{m}
{
\tl_head:n { #1 } % the first letter
\exp_args:Ne \tl_map_function:nN { \tl_tail:n { #1 } } \aim_add_space:n
.\@
}
\cs_new_protected:Nn \aim_add_space:n
{
.\@\nolinebreak
\dim_compare:nTF { \spaceskip > 0pt }
{
\skip_horizontal:n { \spaceskip*2/3 }
}
{
\skip_horizontal:n { (\fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font)*2/3 }
}
#1
}
\ExplSyntaxOff
\begin{document}
\abk{dh}
\abk{zB}
\abk{wxyz}
\makebox{word word \abk{zB} word word}
\makebox[1.3\width][s]{word word \abk{zB} word word}
\makebox[0.95\width][s]{word word \abk{zB} word word}
\setlength{\spaceskip}{1em plus 1em minus 0.5em}
\makebox{word word \abk{zB} word word}
\makebox[1.3\width][s]{word word \abk{zB} word word}
\makebox[0.95\width][s]{word word \abk{zB} word word}
\end{document}