¿Cuáles son las técnicas de programación TeX?
Todos sabemos que el \romannumeral de TeX puede convertir números arábigos posteriores en números romanos minúsculas. \romannumeral tiene varias propiedades: expandirá los tokens posteriores hasta obtener un número completo;
Si el número no es un entero positivo, el resultado de su expansión está vacío; 000 es m, 2000 es mm, 10000 es; 10 metros. Cuántas veces es 1000 es cuántos ms. Este es el truco principal de la implementación de \ltx@CarNumth. Ahora mire la definición de \ltx@CarNumth: \ltx@CarNumth se inicia con \romannumeral y usa la propiedad 1 para lograr el efecto de expandirla dos veces para obtener el resultado. Los tres siguientes \expandafter expanden \ltx@GobbleNum dos veces, y \ltx@GobbleNum también se inicia con \romannumeral: aquí \LTXcmds@num es \number o \the\numexpr, usado para convertir el parámetro #1 a números arábigos (registrados como n), conectados con los siguientes 000, se convierten en n m mediante \romannumeral. \LTXcmds@GobbleNum es recursivo de cola: se usa para generar n \csname LTXcmds@Gm. Finalmente, se termina la recursividad. Se expande a \LTXcmds@Gm comiendo un parámetro y luego devolviendo un \endcsname, finalizando el \csname anterior. Después de comer n parámetros (\ltx@CarNumth es para obtener el enésimo elemento, y solo debe comer n-1 parámetros, por lo que la definición de \ltx@CarNumth tiene un grupo vacío al final para el marcador de posición, evitando el cálculo), se obtiene que \ltx@zero es la constante de carácter 0, que termina la expansión de \romannumeral. Finalmente, \LTXcmds@CarNumth hace la limpieza: el entero más grande de TeX es 2147483647, por lo que \ltx@CarNumth se puede usar hasta 2147483. Pero puede que no pase mucho tiempo antes de que la memoria de TeX sea insuficiente. Usando l3benchmark para pruebas de rendimiento en mi vieja computadora portátil (T9600), \ltx@CarNumth es un orden de magnitud más rápido que \tl_item:nn. El script utilizado para las pruebas es que si el rendimiento de la máquina es mejor, la diferencia puede no ser tan obvia. Solo tome este ejemplo. Si está interesado, puede echar un vistazo al documento de código fuente source3.pdf de LaTeX3. Se puede decir que es un maestro en varias técnicas. Por ejemplo, la implementación de \prg_replicate:nn. El script de prueba anterior es muy técnico.