[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