Skrytí zdrojového kódu
© Jaroslav Reichl, 2008

Některé notebooky, které vytvoříme, mohou mít velmi rozsáhlý zdrojový kód, který by mohl uživatele odradit od používání notebooku. Navíc uživatel neznalý Mathematicy by mohl neopatrným zásahem do zdrojového kódu způsobit vážné chyby při jeho běhu. Proto je vhodné tyto části notebooku skrýt a uživateli nechat přístupné jen ty části, v nichž může měnit vstupní parametry výpočtu.
A jak na to?
Vše vysvětlíme na příkladu:
Zobrazte graf funkce y = (ax^2) + bx + c a vypočítejte její průsečíky s osami kartézského systému souřadnic.
Vlastní kód bude vypadat takto:

a=1;
b=-4;
c=-5;

funkce=a (x^2)+b x+c;
delta=2;
prusecikyx=Solve[funkce==0,x];(*Nalezení průsečíků s osou x.*)
prusecikx1=x/.prusecikyx[[1]];(*Vyjmutí průsečíků z Listu, do něhož jsou při řešení automaticky umístěny.*)
prusecikx2=x/.prusecikyx[[2]];
pruseciky=funkce/.x->0;(*Výpočet průsečíku s osou y. Zde je tento postup zbytečný, protože víme, že musí vyjít c. Nicméně na ukázku, jak lze v podobných případech postupovat ... *)

If[Im[prusecikx1]==Im[prusecikx2],(*Zjištění, zda jsou kořeny kvadratické rovnice reálné nebo komplexní. Rozmyslete si proč tohle funguje.*)
{x1=prusecikx1-delta,
x2=prusecikx2+delta},
{x1=-5,
x2=5}];

Plot[funkce,{x,x1,x2},AxesLabel->{"x","y"},AxesOrigin->{0,0},PlotRange->All](*Vykreslení grafu funkce*)

If[Im[prusecikx1]==Im[prusecikx2],(*Závěrečný výpis*)
If[prusecikx1≠prusecikx2,
Print["Funkce y = ",TraditionalForm[funkce]," protíná osu x v bodech ",prusecikx1," a ",prusecikx2,". Osu y v bodě ",pruseciky,"."],
Print["Funkce y = ",TraditionalForm[funkce]," protíná osu x v jednom jediném bodě - v bodě ",prusecikx1,". Osu y v bodě ",pruseciky,"."]],
Print["Funkce y = ",TraditionalForm[funkce]," osu x neprotíná! Osu y protíná v bodě ",pruseciky,"."]]

Pokud nechceme uživatele odradit zdrojovým kódem, můžeme tento kód skrýt. Budeme postupovat takto (v tomto notebooku je výsledný zdrojový kód znovu zkopírován, ve vašem notebooku to dělat nemusíte):
=> Označíme celý blok, v němž probíhá výpočet, jako novou funkci (např. KvadratickaFunkce - viz dále). Za celý blok pak napíšeme středník, aby se při výpčtu nezobrazoval.
=> Nově zavedená funkce bude mít tři parametry (a, b, c), v závislosti na nichž se bude graf funkce vykreslovat a budou se počítat příslušné průsečíky.
=> Název nově zavedené funkce včetně konkrétně určených parametrů vložíme do nové buňky.
=> Nyní je nutné Mathematice "říci", že před vyhodnocením této buňky, má vyhodnotit buňku s kódem (tj. vlastní funkci KvadratickaFunkce). To provedeme sérií několika kroků:
=>=> Zkontrolujeme, zda buňka s vlastním programovým kódem a buňka, v níž je fukce připravená ke spuštění, nejsou součástí jiné buňky. Pokud součástí jiné buňky jsou, zaškrneme v menu volbu Cell - Grouping - Manual Grouping, označíme buňku, jejíž součástí jsou obě zmiňované buňky a volbou Cell - Grouping - Ungroup Cells buňky oddělíme. Označení buňky provedeme pomocí levého tlačítka myši vpravo v buňce (v modrém ohraničení buňky).
=>=> Buňce se zdrojovým kódem, který chceme skrýt, předřadíme novou textovou buňku: kurzorem "vyjedeme" nad buňku, před níž chceme novou buňku umístit (kurzor bude vodorovný a přes celou šířku notebooku), napíšeme text (např. Zdrojový kód) a buňku označíme jako textovou. Jedná se vlastně o přiřazení stylu dané buňce, což můžeme provést dvojím způsobem: buď pomocí pravého tlačítka myši vyvoláme místní nabídku a zvolíme Style - Text a nebo označíme buňku (levým tlačítkem myši v jejím pravém okraji v modrém ohraničení buňky) a zaškrtneme volbu v menu Format - Style - Text. Buňka bude při výpočtu přeskakována. Lze měnit různé vlastnosti písma (velikost, barvu, ...) - vše lze nalézt v menu Format.
=>=> Označíme právě vytvořenou buňku textovou a buňku, v níž je pouze jediný řádek s funkcí připravenou ke zpracování, a volbou Cell - Grouping - Group Cells buňky spojíme v jednu. Vpravo za ohraničením obou buněk se objevi ještě jedno ohraničení, které bude spojovat obě buňky k sobě.
=>=> Označíme spojenou buňku a dvojklikem na vnější (tj. nejvíce vpravo) ohraničení jí sbalíme. (Stejným způsobem jí můžeme v případě potřeby opět rozbalit.)
=>=> Právě uzavřenou buňku nastavíme jako inicializační (tj. jako buňku, která se bude spouštět před jinou buňkou, jejíž výpočet spustíme). To provedeme volbou Cell - Cell Properties - Initialization Cell.
Inicializační buňka může být v notebooku umístěna v jeho libovolném místě - tj. nemusí nutně předcházet buňce, která se na ní odkazuje!
=>=> Notebook nyní uložíme a uzavřeme. Před uložením se zobrazí následující zpráva:

Vytváření druhého souboru není vhodné, protože bychom museli neustále hlídat, jestli jsou oba soubory k dispozici ve správné složce. Proto je vhodné odpovědět Don't Create ...
=> Otevřeme-li nyní znovu tentýž notebook, stačí "spustit" buňku, v níž je definovaná pouze úvodní rovnice (v našem případě KvadratickaFunkce[...]). Mathematica zobrazí tuto zprávu:

Odpovíme-li Yes, Mathematica před vyhodnocením spouštěné buňky spustí i buňku označenou jako inicializační. 


Upravený zdrojový kód tedy bude vypadat takto (podívejte se též na vlasnosti buněk a všimněte si, že inicializační buňka má jiné označení v modrém ohraničení vpravo):

Zdrojový kód

KvadratickaFunkce[a_,b_,c_]:=Deploy[
funkce=a (x^2)+b x+c;
delta=2;
prusecikyx=Solve[funkce==0,x];
prusecikx1=x/.prusecikyx[[1]];
prusecikx2=x/.prusecikyx[[2]];
pruseciky=funkce/.x->0;

If[Im[prusecikx1]==Im[prusecikx2],
{x1=prusecikx1-delta,
x2=prusecikx2+delta},
{x1=-5,
x2=5}];

Plot[funkce,{x,x1,x2},AxesLabel->{"x","y"},AxesOrigin->{0,0},PlotRange->All,ImageSize->400]

If[Im[prusecikx1]==Im[prusecikx2],
If[prusecikx1≠prusecikx2,
Print["Funkce y = ",TraditionalForm[funkce]," protíná osu x v bodech ",prusecikx1," a ",prusecikx2,". Osu y v bodě ",pruseciky,"."],
Print["Funkce y = ",TraditionalForm[funkce]," protíná osu x v jednom jediném bodě - v bodě ",prusecikx1,". Osu y v bodě ",pruseciky,"."]],
Print["Funkce y = ",TraditionalForm[funkce]," osu x neprotíná! Osu y protíná v bodě ",pruseciky,"."]]];

KvadratickaFunkce[1,-4,-5]