Saltar al contenido

Imprimir código LaTeX en LuaTeX

Solución:

Otra opción es utilizar el luacode paquete y su luacode* entorno, que no se expande tan bien:

documentclass{article}
usepackage{array,longtable}
usepackage{luacode}
begin{luacode*}
  function mymulticol()
    tex.sprint([[multicolumn{3}{l}{1}&bf 2]])
  end
end{luacode*}
begin{document}

begin{longtable}{p{8cm}rrr}
textbf{1}&2é&3&4\ hline\
multicolumn{3}{l}{1}&bf 2\
multicolumn{3}{l}{1}&bf 2\
directlua{mymulticol()}
end{longtable}

end{document}

En general, solo debe tener llamadas a funciones simples en directlua, el código complejo es más difícil de mantener debido a problemas de expansión y la combinación de código Lua y TeX. Para fragmentos más largos de código Lua, es mejor colocarlos en un archivo dedicado (posiblemente como un módulo LuaTeXBase).


Para explicar por qué surgen tales problemas, considere que directlua hace dos cosas: primero expande su argumento como lo haría escribir en un archivo, segundo, interpreta la expansión como código Lua. Ambos pasos deben tener éxito y producir resultados significativos. Como ejemplo sencillo, intentamos imprimir TeX (dando el logo de TeX) de Lua. directlua{tex.sprint(TeX)} expande el TeX comando, lo que lleva a la basura en el lado de Lua. directlua{tex.sprint(noexpandTeX)} previene la expansión para que Lua vea tex.sprint(TeX), que sigue siendo un código Lua inválido porque Lua espera una cadena. El próximo refinamiento directlua{tex.sprint("noexpandTeX")} al menos no causa errores de compilación, pero aún no da el resultado deseado: Lua ve tex.sprint("TeX") e intenta interpretar el escape de barra invertida (en este caso, la barra invertida se elimina porque T no es una secuencia de escape válida). Solo si suprimimos la interpretación de escape de barra invertida con directlua{tex.sprint([[noexpandTeX]])} el código funciona como se esperaba. Tenga en cuenta que en este caso tuvimos que suprimir tanto la expansión TeX como el carácter de escape de Lua para obtener el resultado deseado.

directlua expande completamente sus argumentos. Por lo tanto, debe asegurarse de que el producción de tex.print es igual a lo que habría escrito directamente en el archivo. Por ejemplo en lugar de

directlua{tex.print("multicolumn{3}{l}{1}&bf 2")}

usar

directlua{tex.print("string\multicolumn{3}{l}{1}&string\bf 2")}

Lo que necesitas ver es la expansión. Ambos directlua al igual que luacode ampliar completamente sus argumentos. Escapar con "" normalmente funciona. También hay luastringescape pero también tuve problemas para usarlo. Para bloques grandes, mejor use directlua { dofile('mysetups.lua')}, consulte la página 18 del manual.

documentclass{article}
 usepackage[utf8]{luainputenc}
 begin{document}

 defname{Yiannis}
 begin{luacode}
 function Test(name)
     tex.print{name}
 end
 Test("name")
 end{luacode}

 directlua{tex.sprint(Test("name"))}
 end{document}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *