¿Qué es una dimensión interna/pegamento/pegamento adhesivo?

¿Qué es una dimensión interna/pegamento/pegamento adhesivo?

En la documentación de l3skips \dim_eval:nse advierte

Esto [...] requiere una terminación adecuada si se usa en una tarea de estilo TeX, ya que no es un ⟨dimensión interna⟩.

Se pueden encontrar advertencias análogas en las descripciones para \skip_eval:ny \muskip_eval:ncon ⟨pegamento interno⟩ y ⟨pegamento interno⟩ en lugar de ⟨dimensión interna⟩.

Estoy bastante familiarizado con el manejo de saltos y dimensiones en TeX, pero nunca antes me había encontrado con la expresióndimensión interna. En el TeXbook no pude encontrar ninguna explicación de la frase fuera de la notación gramatical bastante técnica del capítulo 24, que seguramente contiene toda la información necesaria pero que realmente no me ayudó.

Entonces, ¿qué es exactamente unadimensión interna? ¿Cuáles son otros tipos de dimensiones? (¿Dimensiones externas?) ¿Cuáles son ejemplos de comportamiento diferente de los dos (como el aludido en la advertencia anterior)?

Respuesta1

Primero me ocuparé del concepto general de TeX y luego de por qué es importante en la documentación de esas expl3funciones.

Una dimensión interna (o recuento interno o lo que sea) es algo que ha sido analizado por TeX y ahora está almacenado en la forma correcta. Así TeX 'sabe' que una dimensión internaesuna dimensión válida y no tiene que "buscar" ningún material adicional. Por el contrario, una dimensión externa (etc.) es algo que se compone de tokens discretos y TeX tendría que volver a analizarlo para poder usarlo. Así cuando nosotrosescribir 12.0pt, estamos dando unexternorepresentación (TeX tendría que analizarla para saber que es una dimensión válida), pero después

\newdimen\mydimen
\mydimen=12pt %

Puedo usar \mydimeny TeX lo hacenoNecesito analizar cualquier cosa: \mydimentiene una dimensión interna.

¿Porque es esto importante? Se trata de las reglas de análisis de TeX, en particular que TeX permite un espacio final opcional después de dimensiones, números enteros,etc., y lo más importante es que con una representación externa, TeX no deja de analizar hasta que encuentra algo que no "encaja". Por ejemplo

\def\foo{123}
\newcount\fooint
\fooint=123 %
\newcount\testint
%%%
\testint=\foo 456 %
\showthe\testint
\testint=\fooint 456 %
\showthe\testint

Verás que el primer caso da un resultado incorrecto: tenemos una macro que simplemente se expande a 123y TeX sigue buscando un número entero hasta que llegamos al espacio opcional. Por el contrario, con una representación de recuento interno, no se trata de analizar:\fooint es 123.

El punto clave es que una representación interna es "más segura" de usar (y más rápida): nunca hay dudas sobre dónde termina.


¿Cómo se relaciona esto con expl3? Algo así \dim_eval:nse usa para tomar una expresión y convertirla en una dimensión. Sin embargo, resulta conveniente permitir que eso también sea simplemente tipografiado, almacenado mediante expansión en una macro ( tl),etc.Para hacer eso, tenemos que arreglar que la evaluación resulte en unexternorepresentación, no unainternouno. Eso significa que estas funciones se comportan como almacenar un valor como una macro: hay que vigilar la terminación.

Para todo expl3uso "puro", eso no es un problema, ya que tenemos la terminación correcta en los lugares correctos. Pero si combinas el uso de estas funciones con programación TeX más clásica, necesitas saber cómo se comportarán. Elrespuesta de egregmuestra esto muy bien.


Para aquellos que quieran los detalles de TeX, \dim_eval:nestá en términos primitivos.

\the\dimexpr #1\relax

mientras que si queremos terminar con una representación interna solo queremos

\dimexpr #1\relax

Sin embargo, eso no se puede usar en composición tipográfica o (con éxito) dentro de una xexpansión de tipo -, por lo tanto, no es adecuado para la definición que queremos.

Respuesta2

Considere el siguiente ejemplo

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn
\cs_set_eq:NN \dimeval \dim_eval:n
\ExplSyntaxOff

\newlength{\mylen}

\begin{document}

Do an assignment \mylen=\dimeval{3pt+1cm} plus something else.

\end{document}

lo que genera un error

! Missing number, treated as zero.
<to be read again> 
                   s
l.12 ...assignment \mylen=\dimeval{3pt+1cm} plus s
                                                  omething else.

Esto es precisamente a lo que se hace referencia en interface3.

An <internal dimension>es cualquier \dimenregistro o cualquier registro interno que almacene una longitud (rígida), como \parindent; con extensiones e-TeX, también \dimexpres una instancia de <internal dimension>.

Otro hecho importante es que \newlengthasigna un \skipregistro, por lo que TeX esperará pluslas minusespecificaciones; esto no ocurre cuando \setlengthse usa, porque la macro proporciona la \relaxterminación adecuada.

información relacionada