[cstex] Úlety v LuaTeXu
Jaroslav Hajtmar
hajtmar at gyza.cz
Mon May 3 22:14:24 CEST 2010
Dobrý den.
Trochu experimentuji s LuaTeXem a narazil jsem na pár věcí, které mne
docela překvapily
a které se dají docela zajímavým způsobem použít (chystám v nejbližší
budoucnosti větší ukázku použití)
Nyní posílám jen krátkou ukázku pro zájemce, která ukazuje, proč je
právě Lua tím "vyvoleným".
Jako docela "úlet" mi připadá, že si v Lua zdrojáku nadefinujete pomocí
Lua stringu TeXové makro, které volá prostřednictvím LuaTeXového příkazu
\directlua Lua funkci, a když potom tento string "zapíšete do LuaTeXu",
tak můžete ve zdrojáku LuaTeXu toto makro následně používat, aniž byste jej
museli definovat v LuaTeXovém zdrojáku (a aniž by bylo v TeXovém
zdrojáku viditelné).
Když jsem na tuto záležitost narazil, dost jsem pozměnil filozofii
jednoho svého lua výtvoru, který jsem před časem poslal do konfery. Dost
zásadním způsobem se koncepce aplikace "scancsv" změnila a řada
začátečníků bude asi příjemně překvapena co lze s LuaTeXem dokázat ...
Přeji pěkný den
Jaroslav Hajtmar
Následuje ukázka:
\directlua{dofile("ulet.lua")} % Načtení "knihovny" (zdroják - viz níže)
% Po načtení je k dispozici předdefinované makro \texmacroextone viz.
ukázka níže ve zdrojáku
\def\texmacroexttwo#1{% Definice makra ve zdrojáku LuaTeXu s využitím
"knihovní" funkce
\directlua{luafunctionext(#1)}
\par
}
% POZN:
% Použití knihoven načítaných pomocí dofile() je optimální. V externím
% lua souboru má backslash jiný catcode, takže zápisy maker jsou pohodlnější
% a přehlednější
%
% Obsah souboru ulet.lua je následující, stačí zkopírovat a odstranit
komentovací znaky tj. %:
%
%-- Začátek Lua souboru
%
%function luafunctionext(num)
% for i=1, num do
% tex.sprint(i..[[) Hello\par]])
% end
% tex.sprint([[\blank[big] ]])
%end
%
%luastring=[[
%\def\texmacroextone#1{
%\directlua{luafunctionext(#1)}}
%]]
%
%tex.sprint(luastring)
%
%-- Konec Lua souboru
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% A nyní ukázka užití Lua kódu uvnitř LuaTeXového zdrojáku:
% Všimněte si způsobu definice TeXových maker, které se následně dají
% běžně použít v LuaTeXovém zdrojáku. Definování TeXových maker tímto
% způsobem má svá úskalí, které plyne z toho že backslash má nyní jiný
catcode,
% takže jsou definice maker trochu nepřehledné.
%
\startluacode
function luafunction(num)
for i=1, num do
tex.sprint(i..') Hello\\par')
end
tex.sprint('\\blank[big]')
end
luastring1='\\def\\texmacroone\#1\{\\directlua\{luafunction(\#1)
\}\\par\}\n'
tex.sprint(luastring1)
luastring2=[[
\\def\\texmacrotwo#1{\\directlua{luafunction(#1) }}
]]
luastring2 = luastring2:gsub('\\\\','\\')
tex.sprint(luastring2)
\stopluacode
% samozřejmě můžeme definovat makro i přímo ve zdrojáku TeXu, které volá
Lua
% funkci, která byla definována ve zdrojáku LuaTeXu v prostředí
\startluacode \stopluacode
\def\texmacrothree#1{
\directlua{luafunction(#1)}
}
\starttext
% Ukázky užití:
% Makro definované v externím lua souboru (v TeXovém zdrojáku NENÍ
definice makra viditelná)
\texmacroextone{2}
% Makro definované ve tomto zdrojáku volá lua funkci definovanou
% v externím lua souboru (v TeXovém zdrojáku JE definice makra viditelná)
\texmacroexttwo{3}
% Makro definované "nepřímo" v tomto LuaTeXovém zdrojáku (je definované
% v lua zdrojáku v prostředí \startluacode \stopluacode) volá lua funkci
% definovanou v tomto zdrojáku taktéž v prostředí \startluacode \stopluacode
% Řetězec definující makro je uvnitř '' (lze použít i "")
% (v TeXovém zdrojáku NENÍ definice makra viditelná)
\texmacroone{4}
% Ukázka obdobného způsobu definice makra, s tím, že řetězec definující
makro je uvnitř [[ ]]
% (v TeXovém zdrojáku NENÍ definice makra viditelná)
\texmacrotwo{5}
% Makro definované "přímo" v tomto LuaTeXovém zdrojáku (je definované
% přímo v TeXovém zdrojáku volá lua funkci definovanou v tomto zdrojáku
% v prostředí \startluacode \stopluacode
% (v TeXovém zdrojáku JE definice makra viditelná)
\texmacrothree{6}
\stoptext
More information about the csTeX
mailing list