Skriptujeme InDesign (13): Text podruhé - Grafika.cz - vše o počítačové grafice

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

Saal Digital

 

Jaký největší formát fotoknihy v řadě Professional Line ve formátu na šířku lze ve standardní nabídce Saal Digital Fotoservice objednat? Nápověda: Logo sponzora soutěže

V dnešní soutěži hrajeme o:



VSE

Skriptujeme InDesign (13): Text podruhé

Adobe InDesign sazba

14. dubna 2006, 00.00 | V této druhé části našeho výkladu o skriptování textu v InDesignu bude naše pozornost
patřit umisťování textu. Podíváme se na práci s funkcí place, textovými rámečky,
vkládacím bodem a přetečenými místy.

Po předchozím výkladu o hierarchii textových objektů se dostáváme k praktickému použití skriptování při vkládání textu do dokumentů InDesignu. Naše pozornost bude zde patřit jak různým způsobům vložení, tak nastavením parametrů specifických pro textové rámečky či též ošetření přetečení.

Základní postupy při vložení textu

Základním nástrojem pro vkládání textu z externích souborů je metoda place. Tu lze použít jak pro dokument, tak pro stránky či textové rámečky, a dále jednotlivé textové objekty popsané v minulé části (odstavec, řádek, slovo, vybraný text, vkládací bod atd.). Vkládání je přitom možné ze souborů, podporovaných odpovídajícími importními filtry InDesignu (RTF, DOC, text, tagovaný text).

Na tomto místě se podíváme především na nejobvyklejší způsob umisťování textu, a to do textových rámečků. Použití v jiných případech (syntaxe odpovídajících příkazů je většinou obdobná) lze nastudovat z referenční příručky InDesignu, umisťování na stránky jsme popsali dříve .

Chceme-li umístit text do existujícího textového rámečku, můžeme tak učinit s pomocí metody place, která má následující tvar:

place(soubor,dialog,vlastnosti)

kde soubor určuje soubor z něhož se provádí načítání, dialog je volitelná logická hodnota, jež určuje, zda se má při vkládání zobrazit importní dialog, a vlastnosti je volitelná hodnota, určující pole vlastností nového objektu.

Příklad:

//Umístí obsah souboru pokus.rtf do rámečku myTF, přičemž se zobrazí importní dialog
myTF.place(File("/c/clanky/skriptid/pokus.rtf"),true)

Připomeňme přitom, že na textový rámeček lze odkazovat různě. myTF v našem předchozím příkladu tedy může být stejně dobře určen jak pozicí v objektové hierarchii InDesignu

//První textový rámeček aktuálního dokumentu
var myTF=app.activeDocument.textFrames[0];

//První textový rámeček první stránky aktuálního dokumentu
var myTF=app.activeDocument.pages[0].textFrames[0];

tak návěstím:

//Rámeček z aktivního dokumentu s návěstím "Hlavní nadpis"
var myTF=app.activeDocument.textFrames.item("Hlavní nadpis");

Druhý případ znamená východisko k automatizované sazbě (typicky periodik), kdy máme sadu pojmenovaných rámečků (pro záhlaví, úvodník, jednotlivé články atd.), případně i příslušně řetězených. Do těch pak provedeme načtení změněných textových a obvykle také i obrázkových souborů vždy při změně vydání. Možné jsou přitom jak hromadné načítání, tak třebas vždy jen vložení do právě vybraného rámečku. Jiná možná aplikace je třeba tvorba vizitek či vstupenek, kdy tentýž textový obsah načteme vícekrát do stejně nastavených rámečků.

Při načítání naznačeným způsobem musí být daný rámeček prázdný. Ošetření dané situace v případě výběru je možné například takto:

if ((app.selection[0].constructor.name=="TextFrame") && (app.selection[0].parentStory.length==0))
{
//Umístíme obsah rámečku a provedeme další zpracování
}

Jinou variantu ošetření dané situace představuje odstranění veškerého textu v dokumentu dříve, než začneme cokoli vkládat:

//odstraní všechen text z dokumentu odkazovaného přes proměnnou myDocument
for (i=0;i<myDocument.stories.length;i++)
{myDocument.stories[i].contents=""}

Pokud chceme přidat text k již existujícímu textu, můžeme k tomu použít především insertion point. Umístění textu na začátek rámečku zajistíme takto:

var myFile= File("/c/clanky/skriptid/pokus.rtf");
myTF.insertionPoints[0].place(myFile);

Možné je i různorodé další umístění, třeba

//Umístí soubor za druhé slovo prvního odstavce
myTF.paragraphs[0].words[1].insertionPoints[-1].place(myFile);

//Umístí soubor před druhé slovo prvního odstavce
myTF.paragraphs[0].words[1].insertionPoints[0].place(myFile);

Připomeňme pak ještě, že lze provést i náhradu libovolného jiného textového prvku. Takže například:

//Importovaným souborem přepíše obsah prvního slova v prvním odstavci daného rámečku
myTF.paragraphs[0].words[0].place(myFile);

Parametry textových rámečků

Nosiče textu v dokumentu, textové rámečky, mají řadu parametrů, které se používají jak při jejich vytváření, tak případných změnách. Mnohé z nich jsou společné pro všechny objekty InDesignu a popsali jsme je již dříve (geometricBounds, rotace, zkosení, tahy, výplně, průhlednost atd.), další jsou specifické pro textové rámečky. V druhém případě se používá nastavení s pomocí objektu textFramePreferences, kdy lze určit parametry, jako je třeba vertikální zarovnání, počet sloupců, odstup vsazení, nastavení účaří aj. (v prostředí InDesignu se odpovídající dialog vyvolá příkazem Objekt-Volby textového rámečku). Podrobný výčet a popis všech parametrů lze najít v referenční příručce, na tomto místě si povšimněme způsobu, jak s danými nastaveními efektivně pracovat. Jedná se zde vlastně o kolekci přiřazení hodnot, kterou lze uložit pod určeným názvem a tu pak používat různě v rámci skriptu - šetří se tím vypisování parametrů a unifikuje zpracování. Více osvětlí příklad:

//Vytvoříme sadu nastavení
var myFramePrefs={textColumnCount: 2, textColumnGutter: "12pt", insetSpacing: "1pt", useFixedColumnWidth: false, verticalJustification: VerticalJustification.topAlign, firstBaselineOffset: FirstBaseline.leadingOffset, ignoreWrap: false};

//Použijeme ji při tvorbě textového rámečku
app.activeDocument.textFrames.add(undefined,undefined,undefined,{textFramePreferences: myFramePrefs, geometricBounds: ["2cm","2cm","4cm","4cm"]});

Přetečení

Obvyklým problémem při vkládání textu je přetečení. To indikujeme s pomocí vlastnosti overflows, která vrací logickou hodnotu true v případě, že je daný textový rámeček přetečený.

//Otestuje rámeček přiřazený proměnné myTF na přetečení
if (myTF.overflows==true) {alert("Tento rámeček je přetečený.")};

Přetečení se dá řešit změnou velikosti rámečku. Nejjednodušší je situace u rámečků, které obsahují pouze jeden sloupec, nejsou řetězeny a neobsahují příliš mnoho přetečeného textu. Zde lze použít metodu fit:

var myDoc=app.activeDocument;
var myTextFrame=myDoc.textFrames.item("TopStory");

if ((myTextFrame.textFramePreferences.textColumnCount==1) && ((myTextFrame.previousTextFrame==null && myTextFrame.nextTextFrame==null) || (myTextFrame.nextTextFrame==null)))
    {myTextFrame.fit(FitOptions.frameToContent)}
else{alert("Daný rámeček nelze zvětšit metodou fit")};

Případně lze použít například následující trik (opět se hodí spíše jen pro kratší text, třeba pro nadpisy, které mohou být na různý počet řádků apod.):

//V proměnné myTF je přetečený rámeček
//Pro snazší zápis dále vytvoříme proměnnou myGB
var myGB = myTF.geometricBounds;

//Natáhneme vertikálně rámeček tak, aby nepřetékal
//(lze samozřejmě použít i jinou hodnotu myLimit - určením hodnoty stanovíme mez, po kterou má pro nás smysl zvětšení,
//obdobně si lze pohrát i s horizontálním nastavení, je-li to možné)
//Hodnota je nastavena ve výchozích měrových jednotkách - je potřeba ošetření jako jsme popsali v části "Stránkové objekty podruhé"
myLimit=5;
myTF.geometricBounds = [myGB[0],myGB[1],myGB[2]+myLimit,myGB[3]];

//Pokud limitní hodnota neodstraní přetečení, skončíme bez úspěchu
if (myTF.overflows){alert("Překročen limit, rámeček nelze protáhnout");
    myTF.geometricBounds = [myGB[0],myGB[1],myGB[2],myGB[3]];
    }
else{//Jinak zjistíme pozici posledního znaku v nepřetečeném textu
    var myLastBaseline = myTF.characters[-1].baseline;
    //a nastavíme nové hranice
    myTF.geometricBounds = [myGB[0],myGB[1],myLastBaseline,myGB[3]]
}

Jinou možnost představuje přelití textu do dalšího rámečku:

//Řetězí daný rámeček s rámečkem označeným jako ""TopStory-pokračování
if (myTF.overflows){myTF.nextTextFrame=app.activeDocument.textFrames.item("TopStory-pokračování")};

Konečně je zde i možnost přidávat další stránky a odpovídající rámečky. Takováto varianta nicméně samozřejmě připadá v úvahu pouze u publikací, které dovolují měnit počet stránek - například knih. Podrobnější výklad by zde překročil rámec tohoto článku, zájemce může každopádně sáhnout po spam_email('.GXd', '@', '252', '128');2fSfQ0Yc.3@.3bbd41b0">tomto odkazu do diskusního fóra o skriptování InDesignu.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » VSE  

 » Rubriky  » Go verze  

 » Rubriky  » Sazba  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: