Sem vložte zadání Vaší práce.
České vysoké učení technické v Praze Fakulta informačních technologií Katedra softwarové inženýrství
Diplomová práce
Konverze dokumentů Microsoft Word do formátu LATEX bc. Jiří Anděl
Vedoucí práce: Ing. Jiří Kašpar
4. ledna 2013
Poděkování Největší poděkování patří mému vedoucímu práce Ing. Jiřímu Kašparovi, jež mě výborně vedl a poskytl maximální pomoc při její tvorbě. Dále bych rád poděkoval svému otci a sestře za psychickou podporu a za příjemné domácí prostředí, v kterém jsem práci převážně psal. Nakonec bych rád poděkoval mým nejbližším přátelům, kteří mi ochotně pomáhali s překladem abstraktu.
Prohlášení Prohlašuji, že jsem předloženou práci vypracoval samostatně a že jsem uvedl veškeré použité informační zdroje v souladu s Metodickým pokynem o etické přípravě vysokoškolských závěrečných prací. Beru na vědomí, že se na moji práci vztahují práva a povinnosti vyplývající ze zákona č. 121/2000 Sb., autorského zákona, ve znění pozdějších předpisů. V souladu s ust. § 46 odst. 6 tohoto zákona tímto uděluji nevýhradní oprávnění (licenci) k užití této mojí práce, a to včetně všech počítačových programů, jež jsou její součástí či přílohou a veškeré jejich dokumentace (dále souhrnně jen „Dílo”), a to všem osobám, které si přejí Dílo užít. Tyto osoby jsou oprávněny Dílo užít jakýmkoli způsobem, který nesnižuje hodnotu Díla, avšak pouze k nevýdělečným účelům. Toto oprávnění je časově, teritoriálně i množstevně neomezené.
V Praze dne 4. ledna 2013
..................... 7
České vysoké učení technické v Praze Fakulta informačních technologií © 2013 Jiří Anděl. Všechna práva vyhrazena. Tato práce vznikla jako školní dílo na Českém vysokém učení technickém v Praze, Fakultě informačních technologií. Práce je chráněna právními předpisy a mezinárodními úmluvami o právu autorském a právech souvisejících s právem autorským. K jejímu užití, s výjimkou bezúplatných zákonných licencí, je nezbytný souhlas autora.
Odkaz na tuto práci Jiří Anděl. Konverze dokumentů Microsoft Word do formátu LATEX: Diplomová práce. Praha: ČVUT v Praze, Fakulta informačních technologií, 2013.
Abstract This work implements converter from Microsoft Office Word into the LATEX format. It analyses used data patterns, suggests principles of conversion between them and verifies reliability of the conversion. Suggested principles of conversion are then being implemented in Visual Basic for Application. Converter is suitable tool for automatization of described process. It allows rapid boost of conversion speed for text documents created and sustained in Microsoft Office Word, for publications which requies LATEX enviroment. Keywords conversion, converter, LATEX, Microsoft Office Word
Abstrakt Tato práce implementuje převodník z dokumentu Microsoft Office Word do formátu LATEX. Analyzuje použité datové formáty, navrhuje principy převodu textu mezi nimi a ověřuje věrnost tohoto převodu. Navržené principy konverze dokumentů implementuje v jazyce Visual Basic for Application. Převodník je vhodným nástrojem pro automatizaci převodu, umožňuje výrazné urychlení převodu textů vytvořených a udržovaných v prostředí Microsoft Office Wordu pro publikace vyžadující prostředí LATEX. Klíčová slova konverze textu, LATEX, Microsoft Office Word, převod textu, převodník
9
Obsah Úvod Uvedení do problematiky . . . . . . . . . . . . . . . . . . . . Stanovení cílů a požadavků na implementovaný produkt požadavky) . . . . . . . . . . . . . . . . . . . . . . . . . Popis struktury diplomové práce . . . . . . . . . . . . . . . . Rešeršní zpracování existujících implementací . . . . . . .
. . . . . . (funkční . . . . . . . . . . . . . . . . . .
17 17 18 20 20
1 Analýza 25 1.1 Datová struktura objektového modelu MS Word . . . . . . . . . 26 1.2 Visual Basic for Applications . . . . . . . . . . . . . . . . . . . . . 33 1.3 TEX a LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 2 Návrh konverze 47 2.1 Návrh převodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 2.2 Návrh chování aplikace . . . . . . . . . . . . . . . . . . . . . . . . 68 2.3 Návrh uživatelského rozhraní . . . . . . . . . . . . . . . . . . . . . 79 3 Realizace 85 3.1 Realizace převodu . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 3.2 Realizace vzhledu aplikace . . . . . . . . . . . . . . . . . . . . . . 91 4 Testování 4.1 Testování 4.2 Testování 4.3 Testování 4.4 Testování 4.5 Testování 4.6 Testování
atributů a jejich vzájemných prolínání . . formátování a jejich vzájemných prolínání tabulek a jejich odkazů . . . . . . . . . . . obrázků a jejich odkazů . . . . . . . . . . . nadpisů . . . . . . . . . . . . . . . . . . . . rovnic . . . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
95 95 97 97 97 101 101
Závěr
107
Literatura
111
A Seznam použitých zkratek
113 11
B Obsah přiloženého CD
115
12
Seznam obrázků 1.1 1.2 1.3 1.4
Převodník . . . . . . . . . . . . . . . . . Datová struktura objektového modelu Struktura kolekce . . . . . . . . . . . . . Objekt Character a jeho členění . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
26 28 28 30
2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 2.15 2.16 2.17 2.18 2.19 2.20
Detekce tučného textu . . . . . . . . . . . . . . . . Detekce Italic textu . . . . . . . . . . . . . . . . . Detekce Italic textu . . . . . . . . . . . . . . . . . Detekce barvy textu . . . . . . . . . . . . . . . . . Detekce zarovnání . . . . . . . . . . . . . . . . . . Detekce výčtu . . . . . . . . . . . . . . . . . . . . . Detekce nadpisů . . . . . . . . . . . . . . . . . . . Detekce znaků . . . . . . . . . . . . . . . . . . . . . Detekce tabulky . . . . . . . . . . . . . . . . . . . Detekce grafického objektu . . . . . . . . . . . . . Detekce poznámky pod čarou . . . . . . . . . . . Detekce titulku . . . . . . . . . . . . . . . . . . . . Detekce odkazu na web . . . . . . . . . . . . . . . Use case diagram . . . . . . . . . . . . . . . . . . . State machine diagram . . . . . . . . . . . . . . . Diagram stavového stroje - Spuštění převodníku Návrh vzhledu - spuštěn . . . . . . . . . . . . . . . Návrh vzhledu - nastavení převodu . . . . . . . . Návrh vzhledu - správa znaků . . . . . . . . . . . Návrh vzhledu - správa příkazů . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
49 50 51 52 54 55 57 58 60 62 63 64 65 70 75 77 82 82 83 83
3.1 3.2 3.3 3.4
Realizace Realizace Realizace Realizace
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
92 92 93 93
4.1 4.2 4.3 4.4
Zobrazení dokumentu před konverzí ve v MS Word Zdrojový kód výstupního souboru . . . . . . . . . . . Zobrazení dokumentu po konverzi v LATEX formátu Zobrazení dokumentu před konverzí ve v MS Word
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
95 96 96 97
vzhledu vzhledu vzhledu vzhledu
-
spuštěn . . . . . . . nastavení převodu správa znaků . . . správa příkazů . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
13
4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 4.16 4.17 4.18
Zdrojový kód výstupního souboru . . . . . . . . . . . Zobrazení dokumentu po konverzi v LATEX formátu Zobrazení dokumentu před konverzí ve v MS Word Zdrojový kód výstupního souboru . . . . . . . . . . . Zobrazení dokumentu po konverzi v LATEX formátu Zobrazení dokumentu před konverzí ve v MS Word Zdrojový kód výstupního souboru . . . . . . . . . . . Zobrazení dokumentu po konverzi v LATEX formátu Zobrazení dokumentu před konverzí ve v MS Word Zdrojový kód výstupního souboru . . . . . . . . . . . Zobrazení dokumentu po konverzi v LATEX formátu Zobrazení dokumentu před konverzí ve v MS Word Zdrojový kód výstupního souboru . . . . . . . . . . . Zobrazení dokumentu po konverzi v LATEX formátu
14
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
98 98 99 99 99 100 100 101 102 102 103 104 105 106
Seznam tabulek 0.1 0.2
Mapovací tabulka UNIX . . . . . . . . . . . . . . . . . . . . . . . . . Mapovací tabulka operačního systému MS Word . . . . . . . . . . .
23 23
1.1 1.2 1.3
Přehled datových typů . . . . . . . . . . . . . . . . . . . . . . . . . . . Určení velikosti papíru . . . . . . . . . . . . . . . . . . . . . . . . . . . Demonstrační tabulka . . . . . . . . . . . . . . . . . . . . . . . . . . .
35 39 44
2.1
Mapovací tabulka konstrukcí rovnic . . . . . . . . . . . . . . . . . . .
67
3.1 3.2
Parametrická tabulka 2 . . . . . . . . . . . . . . . . . . . . . . . . . . Parametrická tabulka 1 . . . . . . . . . . . . . . . . . . . . . . . . . .
89 90
4.1
Mapovací tabulka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
15
Úvod Uvedení do problematiky Microsoft Office Word Microsoft Office Word (dále pouze MS Word) patří mezi nejpoužívanější textové procesory. Textový procesor je v informatice program sloužící k vytváření formátovaného textu - na rozdíl od textových editorů, s nimiž jsou často špatně spojovány. Textové editory postrádají schopnost měnit vzhled obsahu dokumentu.
TEX Mezi oblíbené (zejména v akademických kruzích) jazyky pro počítačovou sazbu je TEX. Zvláště v oborech jako je matematika, fyzika a informatika. Jedná se o velmi silný makrojazyk. TEX je obecně považován za nejlepší nástroj pro sazbu složitých matematických vzorců. Je však i hojně využíván v běžné sazbě stejně tak jako jeho odvozeniny a nadstavby, zvláště pak rozšířující makra LATEX, kterým se v této práci věnujeme.
Konverze Jelikož se popularita TEXu zvyšuje, nastala na trhu poptávka po převodníku, který by dokázal formátovaný text vytvořený v textovém procesoru Microsoft Office Word překonvertovat do formátovaného textu sázecího jazyka TEX. Tímto převodníkem se v této práci zabýváme. Jeho návrhem, analýzou a realizací. V této práci se nebudeme zabývat tím, zda je ten či onen princip tvorby textu lepší, či horší, nýbrž způsobem, jak z jednoho formátu udělat druhý. K realizaci využíváme vnitřní reprezentaci dat, jež MS Word vytváří formou objektové hierarchie. Konkrétně se jedná o převod z Microsoft Office Word 2003 objektové reprezentace do kolekce maker LATEX. 17
Úvod
Stanovení cílů a požadavků na implementovaný produkt (funkční požadavky) V této části jsou detailně popsány úkoly, jež má tato diplomová práce obsahovat.
Analýza použitých datových struktur objektového modelu MS Word MS Word vytváří ze vstupního souboru datovou reprezentaci souboru vyjádřenou objektovým modelem. Cílem tohoto úkolu je danou datovou strukturu objektového modelu rozebrat, popsat a vysvětlit, které objekty se použijí a které jsou naopak pro konverzi redundantní.
Analýza syntaxe formátu LATEX Datová struktura vnitřní reprezentace dat je potřeba přeložit do LATEXové podoby tak, aby formát a obsah textu zůstal stejný. K tomu je nezbytné znát pravidla pro zápis jazyka LATEX. Jako v předchozím úkolu není ke konverzi potřeba znát všechny funkce a příkazy.
Konverze Pomocí znalostí datových struktur objektového modelu MS Word a znalostí syntaxe formátu jazyka LATEX je možno sestavit převodník. Cílem tohoto úkolu je pomocí konverzních tabulek a programovacího jazyka Visual basic for Application vytvořit převodník, který dokáže objektovou reprezentaci vytvořenou systémem MS Word vyjádřit ve formátu jazyka LATEX. Obsah a formát vstupního souboru musí zůstat zachován. Znaková sada MS Word disponuje velmi obsáhlou sadou znaků. Cílem tohoto úkolu je zajistit, aby veškeré znaky, jež se mohou vyskytnout v MS Word, mohly být převedeny do LATEX formátu. Význam a vzhled daného znaku však musí zůstat zachován. Styl textu Styl textu jsou předem nastavené formáty a atributy textu. Uživatel si může v MS Word vybrat s předem nadefinovaných stylů, nebo si sám některý vytvořit, či upravit. Tento úkol požaduje vytvoření převodu těchto stylů a zachování jejich významu a obsahu. 18
Stanovení cílů a požadavků na implementovaný produkt (funkční požadavky) Formát textu Každý text má svůj formát určený zarovnáním, pozicí a strukturou textu. Cílem tohoto úkolu je tento formát zachovat. Zarovnání, pozice a struktura textu daného textu musí zůstat zachována. Atributy textu Každý text má mnoho atributů jako je velikost písma, druh písma, barva písma, barva pozadí atd. Smyslem tohoto úkolu je tyto vlastnosti zachovat. Vzhled daného textu ve vstupním souboru musí být na pohled stejný jako text ve výstupním formátu. Hierarchie nadpisů Stejně jako styl si může uživatel v MS Word vybrat s předem nadefinovaných nadpisů, nebo si sám některý vytvořit, či upravit. Existuje 5 úrovní nadpisů. Cílem tohoto úkolu je zachovat tuto hierarchii. Zároveň je nezbytné dodržet styl daného nadpisu. Tabulky MS Word umožňuje vytvoření tabulek, jejichž obsahem je libolně formátovaný text. Cílem tohoto úkolu je zachovat vzhled dané tabulky včetně jejího obsahu. Zároveň je potřeba zajistit popis tabulky a odkaz na ní. Vložené obrázky a další typy objektů Ve vstupním souboru se mohou nacházet i grafické objekty. Cílem tohoto úkolu je zajistit jejich převod tak, aby se ve výsledném formátu zobrazily stejně. Zároveň je potřeba zajistit popis objektu a odkaz na něj. Seznam použité literatury Tento úkol pojednává o tom, že převodník musí umožnit zachovávat citace a seznam použité literatury. Zároveň je potřeba umožnit odkázat na libovolnou literaturu. Návrh uživatelského prostředí Cílem tohoto úkolu je, aby byla aplikace uživatelsky příjemná a intuitivní. Neměla by chybět nápověda a možnost uživatelského přizpůsobení. Návrh uživatelského rozhraní se bude provádět pomocí Nielsenově heuristické analýzy. 19
Úvod Testování Posledním úkolem je zajištění testování. Aplikace by měla být jako správný software, náležitě otestován. Existuje několik druhů testování (White box, Black box), které budou na finálním produktu použity.
Popis struktury diplomové práce Popis struktury diplomové práce ve vztahu k vytyčeným cílům. Tato implementační diplomová práce má 5 hlavních části. • Úvod - seznámení s problematikou. • Analýza - rozvaha nad existujícími řešení. • Návrh - výběr nejvhodnějšího řešení, jež jsou v analýze popsány. • Realizace - implementace nejvhodnějšího řešení a výsledná realizace. • Testování - testování výsledného řešení.
Rešeršní zpracování existujících implementací Na začátek před samotným návrhem aplikace je rozumné zjistit současný stav. Zjistit, zda podobná aplikace již neexistuje a pokud ano, tak jaký je její současný stav. Po analýze současného stavu se teprve můžeme rozhodnout, zda má smysl tuto aplikaci vůbec vytvářet.
Porovnání současných aplikací Po důkladném prohledání webu jsme nalezli několik aplikací a metod, jež by disponovaly funkcí odpovídající konvertoru z MS word souboru do LATEX formátu. Nalezené aplikace a metody konverze se dají rozdělit podle operačního systému. Pod Unixovým prostředím existuje několik metod, jenž jsou zdarma, jsou však bohužel zastaralé. Pod operačním systémem Windows od Microsoft jsou všechny aplikace komerčního typu a jejich použití je placené. Výrobci však zdarma poskytují zkušební lhůtu. Současné aplikace jsme vyzkoušeli a porovnali. UNIX prostředí Pro unixové prostředí se nachazí tyto metody a aplikace: • WV - balík knihoven a nástrojů pro čtení MS Word dokumentů. Tento balík knihoven si však nedokáže poradit s dokumenty psaném ve formátu MS Word 2003. 20
Rešeršní zpracování existujících implementací • word2x - zastaralý nástroj pro generování LATEX formátu z MS Word dokumentu. Převádí pouze holý text. Vynechává obrázky a styly a tudíž je prakticky nepoužitelný. • HTML metoda - Tato metoda spočívá v převedení souboru do HTML formátu. Následně se tento formát převede do LATEX formátu. Nejdříve se MS Word dokument převede pomocí WV knihoven do HTML formátu. Z tohoto formátu se poté perlovým skriptem s názvem gbuhtml2latex převede do výsledného LATEX formátu. Neporadí si však s tabulkami. Operační systém MS Windows Pro operačním systém MS Windows se nacházejí tyto aplikace: • Word2TEX - Firma Chikrii Softlab nabízí na svém webu konvertor Word2TEX, jež nabízí konverzi MS Word dokumentu od verze 95 a výše. Konvertor má občas potíže s některými obrázky. K vyzkoušení nabízejí 30-denní verzi. – Výrobce: Chikrii Softlab. – Webová stránka: http://www.chikrii.com/. – Ceny: ∗ normální cena: $99, ∗ studentská sleva: $45, ∗ profesionální licence: $300, ∗ upgrade starší verze na novější: $25. • Word-to-LATEX - Česká firma nabízející konvertor MS Word dokumentu do LATEX, nebo XML formátu. Firma ke konvertoru nabízí i české prostředí a českou podporu. Zkušební verze je časově neomezená, je však omezená počtem konverzí. – Výrobce: Word-to-LaTeX. – Webová stránka: http://www.wordtolatex.com. – Ceny: ∗ normální cena: $99, ∗ studentská sleva: $99, ∗ profesionální licence: $289, ∗ upgrade starší verze na novější : rok zdarma, poté je potřeba koupit nový produkt, nebo se spokojit se starým. 21
Úvod • GrindEQ™ Math Utilities - konvertor MS Word dokumentu do LATEX formátu je zde součástí balíku utilit pojmenované GrindEQ™ Math Utilities. Mimo konvertoru zde nabízejí funkce jako je například převod LATEXu do MS Wordu, Normalizér, nebo Image do PostScript konvertor. – Výrobce: GrindEQ. – Webová stránka: http://www.grindeq.com. – Ceny: ∗ ∗ ∗ ∗
normální cena: $99, studentská sleva: $49, profesionální licence: $1300, upgrade starší verze na novější : $12.
• Word-to-LATEX od SoftSea - tento produkt je až podezřele velmi podobný produktu Word-to-LATEX. Nejspíš se jedná o distributora, jenž si zakoupil profesionální licenci. – Výrobce: SoftSea. – Webová stránka: http://www.softsea.com. – Cena: $99.
Porovnání současně existujících implementací Porovnání současných aplikací a metod jsou vyzobrazeny na tabulce porovnání. Porovnali jsme služby a funkce, které jsou k danému konvertoru nezbytné. Čili podpora českých znaků, podpora obrázků, podpora tabulek, převod stylů formátů a atributů písma, cena, kvalita uživatelské rozhraní, uživatelská podpora a podporovaná verze MS Wordu. Jelikož je tabulka velmi rozsáhlá, je rozdělena do dvou podtabulek rozdělených podle operačního systému. Mapovací tabulka 0.1 UNIX a mapovací tabulka 0.2 operačního systému MS Word. Závěr porovnání současně existujících implementací • Z porovnání lze vidět, že pokud si chce člověk pořídit kvalitní konvertor, musí za něj zaplatit. Existují sice způsoby, které jsou zadarmo, má to však dopad na kvalitu konverze (chybějící tabulky, chybějící obrázky). • Konvertory volně ke stažení jsou nepoužitelné. Kvalitní konvertory jsou pro akademické užití moc drahé. • Žádná z distribucí nepodporuje MS Word 2003. • Tato implemetační práce má tedy smysl a má i uplatnění na trhu.
22
Rešeršní zpracování existujících implementací
Tabulka 0.1: Mapovací tabulka UNIX Funkce a služby Podpora českých znaků Podpora obrázků Podpora tabulek Převod stylů, formátů a atributů písma Cena Uživatelské rozhraní Uživatelská podpora Podporovaná verze MS Wordu
WV Ano Ano Ano Ano Ano Ne Ne Od 2005 výše
word2x Ne Ne Ne Ne Ano Ne Ne Všechny
HTML metoda Ne Ano Ne Ano Ano Ne Ne Všechny
Tabulka 0.2: Mapovací tabulka operačního systému MS Word Funkce a služby Podpora českého kódování Podpora obrázků Podpora tabulek Převod stylů, formátů a atributů písma Cena (normál/student/profi) Uživatelské rozhraní Uživatelská podpora Podporovaná verze MS Wordu
Word2TEXod SoftSe Ano S potížemi Ano Ano
Word-to-LATEX Ano Ano Ano Ano
GrindEQ™ Ano Ano Ano Ano
$99/ $45/ $300 Ne Ano Od 2007 výše
$99/ $99/ $289 Ano Ano Od 2007 výše
$99/ $49/ $1300 Ano Ano Od 2007 výše
23
KAPITOLA
Analýza V této kapitole budeme analyzovat prvky, které se podílejí na převodu externí reprezentaci vstupního textového dokumentu na výstup v LATEXu. Celý proces je znázorněn na tomto obrázku 1.1. Popis prvků figurující v tomto procesu je vysvětlen v následujícím výčtu. • Externí reprezentace vstupního textového dokumentu. Jedná se o dokument, který chceme převést do LATEX formy. • MS Word. MS Word ve kterém dokument otevřeme. • Uživatel. Osoba, jež chce p6eložit dokument do LATEX formy. • Externí reprezentace výstupního textového souboru. • Vnitřní reprezentace vstupního textového souboru. Jedná se o vnitřní datový model reprezentující vstupní textový dokument. • Převodník. Cíl naší práce. Jeho úkolem je převádět vnitřní reprezentace výstupního textového souboru do LATEX formy. • Výstup v LATEXu. Obsah a vzhled externí reprezentace vstupního textového dokumentu vyjádřený pomocí LATEXu. Proces probíhá následujícím způsobem. 1. Uživatel spustí textový dokument, jenž chce převést do LATEX formy. 2. MS Word automaticky převede externí reprezentaci vstupního textového dokumentu na vnitřní reprezentaci vstupního textového dokumentu. 3. Uživatel spustí převodník, který pomocí převodních tabulek a algoritmů vytvoří výstupní soubor v LATEX formě. 25
1
1. Analýza
Obrázek 1.1: Převodník
1.1
Datová struktura objektového modelu MS Word
MS Word používá pro veškeré manipulace s textem dokumentu načteného ze vstupního souboru vnitřní objektovou reprezentaci. Díky tomu nemusíme vstupní soubor syntakticky analyzovat a dělit ho na dílčí prvky. Můžeme pracovat rovnou s objekty, jež nám MS Word automaticky po načtení souboru vytvoří. V této kapitole si popíšeme datovou strukturu tohoto modelu. Celá struktura je velmi obsáhlá, proto si popíšeme pouze části, které jsou potřebné ke konverzi. Hlavním a kořenovým prvkem tohoto objektového modelu je objekt ActiveDocument, který reprezentuje dokument, který máme otevřený. Tento objekt se skládá z kolekcí, jejichž hlavni hierarchie je znázorněna na obrázku 1.2. Kolekce jsou skupiny objektů stejných datových typů. Struktura kolekce je u všech kolekcí stejná a je znázorněna na obrázku 1.3. Např. kolekce Characters obsahuje kromě metody pro práci s kolekcí také objekty typu Character, jež jsou na obrázku pojmenovány jako Item 1 ... Item N. Hierarchie na obrázku 1.2 je uspořádána následovně. 26
1.1. Datová struktura objektového modelu MS Word
1.1.1
Popis hierarchie ActiveDocument
• Active Document - je kořenový prvek celé hierarchie. Obsahuje všechny objekty typu Character (znak), všechny objekty typu Word (slovo), všechny objekty typu Sentence (věta), všechny objekty typu InlineShape (vložený objekt) a všechny objekty typu Table (Tabulka). Všechny tyto objekty uskupuje pomocí následujících kolekcí. • Sentences - kolekce objektů typu Sentence. Tato kolekce soustřeďuje všechny věty obsažené v dokumentu. Kromě objektů obsahuje kolekce také metody. Např. metodu Count pro zjištění počtu vět v dokumentu. Zároveň konkrétní objekt Sentence obsahuje všechny objekty typu Character (znak) a všechny objekty typu Word (slovo), které do dané Sentence(věty) patří. Např. věta: Kobyla má malý bok obsahuje kolekci slov, jež jsou Kobyla, má, malý a bok. A kolekci znaků K,o,b,y,l,a, ,m,á, ,m,a,lý, ,b,o,k. S oběma těmito kolekcemi může libovolně pracovat. Dále se též odkazuje na kolekci, jejíž je součástí. Např. konkrétní věta se může odkazovat na kolekci vět. Tato kolekce však v sobě má pouze tuto větu. Tímto se ze stromu stává graf a musíme si tedy dát pozor na zacyklení. • Words - kolekce objektů typu Word. V případě, že se na ní dotazujeme z objektu ActiveDocument, obsahuje tato kolekce všechna slova. V případě, že se na ní dotazujeme z objektu věta, obsahuje pouze slova dané věty. V případě, že se na ní dotazujeme z objektu slovo, obsahuje tato kolekce pouze toto slovo. V případě, že se na ní dotazujeme z objektu znak, obsahuje tato kolekce pouze tento znak. • Characters - kolekce objektů typu Character. V případě, že se na ní dotazujeme z objektu ActiveDocument, obsahuje tato kolekce všechny znaky. V případě, že se na ní dotazujeme z objektu věta, obsahuje pouze znaky dané věty. V případě, že se na ní dotazujeme z objektu slovo, obsahuje pouze znaky daného slova. V případě, že se na ní odkazuje z objektu znak, obsahuje tato kolekce pouze tento znak. • InlineShapes - kolekce objektů typu InlineShape (vložený objekt). V případě, že se na tuto kolekci dotazujeme z objektu ActiveDocument, obsahuje tato kolekce veškeré vložené objekty. V případě, že se na ní dotazujeme z objektu věta, slovo, nebo znak, obsahuje pouze vložené objekty, kterých jsou věta, slovo, nebo znak součástí. • Tables - kolekce objektů typu Table.V případě, že se na tuto kolekci dotazujeme z objektu ActiveDocument, obsahuje tato kolekce veškeré tabulky. V případě, že se na ní dotazujeme z objektu věta, slovo, nebo znak, obsahuje pouze tabulky, kterých jsou věta, slovo, nebo znak součástí. 27
1. Analýza
Obrázek 1.2: Datová struktura objektového modelu
Obrázek 1.3: Struktura kolekce
28
1.1. Datová struktura objektového modelu MS Word Elementární datovou strukturou je znak a tudíž budeme veškeré informace o vzhledu textu čerpat z něho. Samozřejmě, že by se vzhled dal čerpat i z jeho abstraktů jako je slovo, nebo věta, ale může zde nastat problém, jež budu figurovat na následujícím příkladu. Představme si toto slovo: "napůl". Toto slovo je podtržené pouze do půlky, čímž se dostáváme k jádru problému. Kdybychom totiž čerpali vzled z objektu slovo, dostali by jsme informaci o tom, že je slovo celé podtržené (nebo, že není podtržené vůbec), což je nežádoucí. Výsledkem příkladu tedy je, že z důvodů, že se vzhled textu může měnit od písmena k písmenu, musíme volit jako elementární datovou strukturu znak, neboli object Character. Proto se dále budeme zabývat objektovým modelem pouze z pohledu znaku. Tento pohled lze vidět na obrázku 1.4.
1.1.2
Popis objektu Character a jeho částí
Následuje popis vlastností objektu typu Character (znak). Atributy textu • Bold - tato metoda vrací jako parametr hodnoty – -1 je-li znak tučné. – 0 je-li znak netučný. • Italic - tato metoda vrací jako parametr hodnoty – -1 je-li znak typu italic. – 0 není-li znak typu italic. • Underline - tato metoda vrací jako parametr hodnoty – 1 je-li znak podtržený. – 0 není-li znak podtržený. • Font - Pod tento objekt spadají ještě dvě další metody , které ke konverzi budeme potřebovat. – Size - Metoda Size objektu Font vrací velikost znaku v tzv. pointech. 1 point = 0,3528 mm. – Color - Metoda Color objektu Font vrací barvu ve 4 bytech ve formátu 00BBGGRR, kde R je obsažení červené v rozmezí od 0255, G je obsažení zelené v rozmezí 0-255 a B je obsažení modré také v rozmezí 0-255. • HighlightColorIndex - tato metoda vrací jako parametr číslo, které označuje typ barvy, kterým je písmo zvýrazněno. Je-li 0, písmo zvýrazněné není. Pro kladné hodnoty má Word vlastní tabulku, kde číslo určuje typ barvy. 29
1. Analýza
Obrázek 1.4: Objekt Character a jeho členění
30
1.1. Datová struktura objektového modelu MS Word • Text - tato metoda vrací jako parametr hodnotu znaku v Unicode kódování. Formátování textu • List - tento objekt reprezenteje skutečnost, zda je znak součástí nějakého výčtu (neboli formátovaného prostředí), či nikoliv. Zda tomu tak je zjistíme díky metodě count, jež tato kolekce nabízí. – Vrací-li metoda count nenulovou hodnotu, znak se ve výčtu nachází. – Vrací-li metoda count nulovou hodnotu, znak se ve výčtu nenachází. Pod tento objekt spadají ještě dvě metody, které ke konverzi budeme potřebovat. – ListType - Metoda ListType objektu List vrací typ výčtu. Typ výčtu může být: ∗ číslovaný, ∗ nečíslovaný. – ListLevelNumber - Metoda ListLevelNumber objektu List vrací úroveň vnoření. Může nabývat kladných hodnot od 1-9. • ParagraphFormat - tento objekt reprezentuje skutečnost, zda je znak součástí nějakého odstavce, či nikoliv. Zda tomu tak je, zjistíme díky metodě count, jež tato kolekce nabízí. – Vrací-li metoda count nenulovou hodnotu, znak se v odstavci nachází. – Vrací-li metoda count nulovou hodnotu, znak se v odstavci nenachází. Pod tento objekt spadá metoda, kterou budeme ke konverzi také potřebovat. Jedná se o metodu alignment, která určuje zarovnání. A může nabývat těchto hodnot: – 0 - pro zarovnání nalevo, – 1 - pro zarovnání na střed, – 2 - pro zarovnání napravo, – 3 - pro zarovnání do bloku. 31
1. Analýza Tabulky • Tables - kolekce tabulek. Zda se znak v nějaké tabulce nachází, zjistíme díky metodě count, jež tato kolekce nabízí. – Vrací-li metoda count nenulovou hodnotu, znak se v tabulce nachází. – Vrací-li metoda count nulovou hodnotu, znak se v tabulce nenachází. Tato kolekce tabulek v sobě obsahuje i kolekci řádků, sloupců a buněk. Každá tabulka obsahuje pouze dané objekty, které jsou její součástí. • Cells - kolekce buňek. Zda se znak v nějaké buňce tabulky nachází, zjistíme díky metodě count, jež tato kolekce nabízí. – Vrací-li metoda count nenulovou hodnotu, znak se v buňce nachází. – Vrací-li metoda count nulovou hodnotu, znak se v buňce nenachází. • Columns - kolekce sloupců. Zda se znak v nějakém sloupci tabulky nachází, zjistíme díky metodě count, jež tato kolekce nabízí. – Vrací-li metoda count nenulovou hodnotu, znak se ve sloupci nachází. – Vrací-li metoda count nulovou hodnotu, znak se ve sloupci nenachází. • Rows - kolekce řádků. Zda se znak v nějakém řádku tabulky nachází, zjistíme díky metodě count, jež tato kolekce nabízí. – Vrací-li metoda count nenulovou hodnotu, znak se v řádce nachází. – Vrací-li metoda count nulovou hodnotu, znak se v řádce nenachází. Odkazy • Hyperlinks - kolekce odkazů . Zda se znak v nějakém odkazu zjistíme díky metodě count, jež tato kolekce nabízí. – Vrací-li metoda count nenulovou hodnotu, znak se nachází ve slově, které je zároveň odkazem. – Vrací-li metoda count nulovou hodnotu, znak se nenachází ve slově, které je zároveň odkazem. • Pod objekt Hyperlink spadá metoda, kterou ke konverzi budeme potřebovat. Jedná se o metodu Address, jež vrací adresu, na kterou daný objekt Hyperlink odkazuje. 32
1.2. Visual Basic for Applications Vložené objekty • InlineShapes - kolekce vložených objektů. Zda je znak součástí nějakého vloženého objektu, zjistíme pomocí metody count. – Vrací-li metoda count nenulovou hodnotu, znak se ve vloženém objektu nachází. – Vrací-li metoda count nulovou hodnotu, znak se ve vloženém objektu nenachází. Styly a nadpisy • Style - tento objekt (konkrétně jeho metoda), vrací jako parametr název stylu, v kterém se nachází. Defaultně jsou tyto styly Nadpis 1 - Nadpis 5. Uživatel si je však může změnit.
1.2
Visual Basic for Applications
Historie programovacího jazyku Visual Basic pro Aplikace (dále jen VBA) sahá do roku 1994, kdy byl poprvé integrován do aplikací Microsoft Excel a Project (verze 95). Jedná se o jednoduché, velmi silně objektově orientované prostředí. Využívá technologii ActiveX, což je objektově orientovaný protokol (Framework), kterým aplikace zveřejňují a umožňují použití svých služeb ostatním aplikacím v prostředí operačního systému Windows. Smysl Active X je myšlenka, že každá nová aplikace v prostředí operačního systému Windows nemusí být programována od základů. Většina aplikací již v sobě obsahuje stejné funkce, jež by mohly být mezi aplikacemi sdílené. Například stejnou kontrolou pravopisu disponuje Word i Outlook Express, a tak na místo psaní dvou samostatných verzí kódu, postačí jedna, která bude sdílena mezi oběma aplikacemi. Ušetří se tím mnoho času programování, testování a následných oprav chyb. Pomocí ActiveX se tedy mohou vytvářet stavební bloky, z jejichž pomocí se potom sestaví větší aplikace. Programovací jazyk VBA zaujme tím, že oproti běžným programovacím jazykům nevyžaduje své vlastní vývojové prostředí. Veškeré programování pod tímto jazykem se provádí např. v prostředí nástrojů Microsoft Office, jež je většinou k dispozici na každém počítači. Microsoft Office prezentuje veškerá svá data jako objekty se kterými VBA může a umí pracovat. Tyto objekty byly představeny v předchozí kapitole.
1.2.1
Úvod do programování ve VBA
Data VBA není striktně typový jazyk. To znamená, že typ proměnné si programovací jazyk určí sám až při jejím použití. 33
1. Analýza • Proměnné. Příklad: dim i as integer. Tato deklarace určuje, že překladač bude pracovat s proměnnou, jež se nazývá i a bude typu celé číslo. Jak už bylo řečeno, jazyk není striktně typovaný, takže máme dvě možnosti deklarace. – Implicitní deklarace. Do proměnné se zapisuje před jejím vlastním použitím. Příklad: Dim Prijmeni As String – Explicitní deklarace. Deklarace se provádí přímo při jejím použití. Příklad: Prijmeni="Novák" • Konstanty. Příklad: Const Pi = 3.14 V tabulce se nachází přehled datových typů, jejich velikost a rozsah 1.1. Výrazy Výraz je konstrukce složená z proměnných, operátorů a volání metod, které jsou složeny pomocí odpovídající syntaxe jazyka a vyúsťují v jednu hodnotu. • Aritmetické - ˆ,*,/,/,Mod,+,• Relační - <,<=,>,>=,<>,=,Is,Like • Spojovací - &,+ • Logické - And, Eqv, Imp, Not, Or, Xor Příkazy Příkazy jsou zhruba shodné s větami běžných jazyků. Příkaz tvoří kompletní jednotku vykonávání kódu. • Přiřazovací výrazy • Volání metod • Tvoření dat (definice, deklarace) Bloky Blok je skupina žádného nebo více příkazů, která může být použita kdekoli místo normálního příkazu. 34
1.2. Visual Basic for Applications Tabulka 1.1: Přehled datových typů Datový typ Byte Boolean Integer Long Single
Velikost paměti 1 bajt 2 bajty 2 bajty 4 bajty 4 bajty
Double
8 bajtů
Currency
8 bajtů
Decimal Date Object String (proměnná délka) String (pevná délka) Variant (s čísly)
14 bajtů 8 bajtů 4 bajty 10 bajtů + Délka řetězce Délka řetězce
Variant (se znaky)
22 bajtů + délka řetězce Podle typů, z nichž je složen Podle objektů jež obsahuje
Type (Struktura) Collection (Kolekce)
16 bajtů
Rozsah 0 až 255 True nebo False -32 768 až 32 767 -2 147 483 648 až 2 147 483 647 -3,402823E38 až -1,401298E-45 pro záporné hodnoty 1,401298E-45 až 3,402823E38 pro kladné hodnoty -1,79769313486232E308 až -4,94065645841247E-324 pro záporné hodnoty 4,94065645841247E-324 až 1,79769313486232E308 pro kladné hodnoty -922 337 203 685 477,5808 až 922 337 203 685 477,5807 +/-79 228 162 514 264 337 593 543 950 335 Od 1. ledna 100 do 31. prosince 9999 Libovolný odkaz na Object Od 0 do přibližně 2 miliard Od 1 do přibližně 65 400 Libovolná číselná hodnota až do rozsahu typu Double Od 1 do přibližně 65 400 Podle typů, z nichž je složen. Podle objektů jež obsahuje.
Příkazy pro ovlivnění průběhu cyklu • Podmíněné zpracování. – Jednoduchá forma. Příklad: If podmínka Then Příkaz Endif – Úplná forma. Příklad: If podmínka Then Příkaz Else Příkaz Endif – Rozhodovací větvení. Příklad: Select Case Číslo Case 1 Příkaz1 Case 2 Příkaz2 Case Else PříkazDefault End Select • Cykly – For. Příklad: For i=0 To 10 Příkaz Next i – Do 35
1. Analýza ∗ S testem na konci. Příklad: Do While Podmínka Příkaz Loop ∗ S testem na začátku. Příklad: Do Příkaz Loop While Podmínka – For Each. Příklad: For Each item In Array Příkaz Next Moduly a procedury Modul je struktura obsahující globální proměnné a procedury typu Function, Sub a Property. • Function - klasická funkce s návratovou hodnotou a vstupními parametry. • Sub - klasická procedura, nevrací žádnou hodnotu. • Property - vlastnost předem nadefinovaná uživatelem. Kolekce a pole • Kolekce - Objekt kolekce je uspořádáná množina prvků, kterou lze chápat jako samostatnou jednotku. Může odkazovat na skupinu souvisejících položek jako na jediný objekt. Příklad: Dim X As New Collection • Pole - klasické pole, deklaruje se stejně jako proměnné. – Dynamické - délka pole není předem známa a jeho délka se tudíž v průbéhu programu uzpůsobuje počtu položek. – Statické - délka pole je již staticky přiřazena na začátku programu.
1.3
TEX a LATEX
TEX je jazyk pro sazení textu. Jeho tvůrcem je profesor Donald Ervin Knuth, který byl nespokojen se školním nakladatelstvím. Konkrétně s přístupem nakladatelství k sázení jeho skript. Ve skriptech se objevovalo mnoho chyb, především v matematických vzorcích, a ani typografie nedosahovala dobré úrovně. Stalo se tomu tak ve 70. letech 20. století.
PlainTEX Jelikož je TEX sám o sobě uživatelsky velmi nepříjemný, rozhodl se Donald Ervin Knuth k napsání sady maker, jenž měly usnadnit práci s TEXem, pojmenoval je PlainTEX. Tento poměrně jednoduchý formát je občas nesprávně zaměňován se skutečným programem TEX. 36
1.3.
TEX a LATEX
LATEX Vychází z PlainTEXu. Je to jeho nástavba, neboli abstrakce. LATEX poskytuje sadu maker pro vytváření komplexních dokumentů. Je mnohem více značkovacím jazykem než jeho předchůdce PlainTEX. Integruje podporu pro členění textu, obsah, křížové odkazy, živá záhlaví, číslování rovnic, citace, plovoucí tabulky a obrázky, bez toho, aniž by autor musel vědět, jak se má všechno formátovat. Tuto nadstavbu sestavil v roce 1985 americký počítačový specialista Leslie Lamport.
LATEX 2 Roku 1989 spustili pánové Leslie Lamport, Frank Mittelbach, Chris Rowlay a Rainer Shöpf projekt LATEX 3, jehož cílem je sestavit výkonnou a optimalizovanou sadu základních příkazů doplněnou různými baličky, které podle potřeby doplní specifické funknce. Jedná se však o problém dlouhodobý a poslední zmíňka o něm byla v roce 1997 v knize Goossens. Proto vznikl vývojový mezistupeň s názvem LATEX 2.
1.3.1
Syntaxe
• Příkazy - Každý příkaz v LATEXu začíná znakem \(zvaného backslash) a svým jménem, jež je tvořeno řetězcem písmen, nebo jedním nepísmenem. Po názvu následují dva druhy argumentů. Příklad: \názevPříkazu[NepovinnéParametry]{PovinnéParamtry} – Povinné par. - jež jsou umístěny ve složených závorkách {} – Nepovinné par. - jež jsou umístěny v závorkách hranatých [ ] • Prostředí - Určitá část dokumentu, na kterou je aplikováno nějaké formátování, nebo speciální syntaxe, seznamy, zarovnání textu, apod. Zároveň definuje rozsah působnosti příkazů. Je-li použit příkaz uvnitř prostředí, má vliv pouze v tomto prostředí. Příklad: \begin{Název prosředí}...end{Název prosředí} • Poznámka. Příklad: %toto je poznámka • Mezery a nové řádky. Je - li mezi slovy více mezer, tabulátorů, nebo konec řádku, LATEX to považuje za jednu mezeru. • Speciální znaky. LATEX obsahuje speciální znaky, které se nezobrazí na výstupu. Musí být vyvolány pomocí speciálních příkazů.
1.3.2
Struktura dokumentu
Dokument v LATEXu se dělí do dvou částí. Hlavička, jež obsahuje základní definici celého dokumentu a zbytek, kde se nachází vlastní text. 37
1. Analýza 1.3.2.1
Třída dokumentu
Třída dokumentu definuje defaultní nastavení vzhledu celého dokumentu. Tento příkaz má nepovinné atributy "volby"a povinný atribut "třída". Příklad: \documentclass [volby] { třída} . Nepovinné atributy • Velikost písma : 10pt,11pt,12pt. • Velikost papíru : je zobrazena v následující tabulce 1.2. • Změnu orientace papíru na šířku provede atribut landscape. • Zobrazení černého čtverečku, jež značí problém s umístěním textu na konci řádku. – zobrazení - draft – nezobrazení - final • Formátování stránky. – pro jednostranný tisk - oneside – pro dvoustranný tisk - twoside • Určení, kde může začínat nová kapitola. – kdekoliv - openany – napravo - openright • Nastavení sazby. – do jednoho sloupce - onecolumn – do dvou sloupců - twocolumn • Sazba titulní stránky a abstraktu na samotné stránce. – povolení - notitlepage – zakázání - titlepage • Způsob sazby literatury - openbib • Zobrazení čísla rovnice na levé straně - leqno • Zarovnání rovnice nalevo - fleqn 38
1.3.
TEX a LATEX
Tabulka 1.2: Určení velikosti papíru Atribut letterpaper legalpaper executivepaper a4paper a5paper b5paper
Velikost v palcích 8.5"x 11" 8.5"x 14" 7.25"x 10.5"
Velikost v mm 216mm x 279mm 216mm x 356mm 184mm x 267mm 210mm x 297mm 148mm x 210mm 176mm x 250mm
Povinné atributy • article - nejčastější a nejvšeobecnější použití. Určena k psaní vědeckých článků. • report - Určena pro psaní delších textů. • book - Určena pro psaní knih. • slides, beamer - Určeny pro tvorbu prezentací. Třída beamer je novější verze slides. • letter- Určena pro psaní dopisů.
1.3.2.2
Balíčky
Balíčky je myšleno rozšířění LATEX maker napsané prostřednictvím PlainTEXu. Těchto balíčků existuje mnoho, proto zde bude pro příklad vypsáno pouze deset u nás nejpoužívanějších. • graphicx - Díky tomuto balíčku můžeme pracovat s grafikou jako jsou obrázky. • ammssymb - Přidává nové matematické symboly, které jsou použité v matematickém módu. • amsmath - Obsahuje matematické rozšíření pro LATEX. • bm - Umožňuje použití řeckých znaků v matematickém módu. • color - Slouží k vytváření barevných pozadí a ke změně barvy písma. • babel - Snaží se poskytnout podporu pro sazbu ve všech evropských jazycích, jež používají latinku. • inputenc - Slouží k nastavení kódování. Můžeme si vybrat například mezi Windows-1250, UTF-8 ,nebo latin2 kódováním. 39
1. Analýza • czech - Slouží k informaci, že daný dokument bude psaný v češtine. LaTeX se podle toho zařídí. • fontenc - Slouží k zajištění načtení správných fontů. • a4wide - Slouží k nastavení okrajů na evropské poměry.
1.3.3
Hierarchické členění textu
Každý text se dá členit do kapitol, sekcí, paragrafů apod. K jejich sázení má LATEX samozřejmě nadefinované své příkazy. Veškeré členění je automaticky číslováno. Číslování se dá vypnout přidáním hvezdičky na konci názvu příkazu. Všechny číslované části jsou automaticky přidávány do obsahu. Následující výpis je řazen od nejvyšší úrovně členění po nejmenší. • Část knihy - Nejvyšší úroveň. Označuje se tak část knihy. Pro její vyvolání se používá příkaz \part. Při psaní této diplomové práce však použita nebyla. • Kapitola - Druhá nejvyšší úroveň. Každá kapitola je při tisku označena slovem "Kapitola" a pořadovým číslem kapitoly, pod tím je vysázen vlastní název. Nová kapitola je vždy vysázena na novou stránku. Pro Kapitolu se používá příkaz \caption. • Sekce - Jedná se o nejpoužívanější členění. Číslování jednotlivých sekcí a podsekcí je hierarchické. Pro vytvoření sekce se používá příkaz \section. • Podsekce - Nižší úroveň sekce. Pro vytvoření sekce se používá příkaz \subsection. • Podpodsekce - Nejnižší úroveň sekce. Pro vytvoření sekce se používá analogicky příkaz \subsubsection. • Paragraf - Po podpodsekci následuje paragraf. Text, jenž následuje po názvu paragrafu nepokračuje na dalším řádku, ale rovnou vedle něho. Pro jeho vyvolání se používá příkaz \paragraph. • podparagraf - Poslední a nejnižší forma členění je podparagraf pro který se používá příkaz \subparagraph.
1.3.4
Formátování textu
Může nastat situace, kdy je potřeba násilně ukončit řádek, stránku, nebo za sebou použít více mezer (jež LATEX úmyslně ignoruje). Pro tyto účel disponuje latex těmito příkazy. • Nová stránka - Násilný přechod na novou stránku se dá zařídit třemi způsoby: 40
1.3.
TEX a LATEX
– \newpage – \clearpage – \pagebreak - tento příkaz se navíc bude snažit zaplnit stránku roztažením pružných mezer. • Nový odstavec - Nový odstavec můžeme vložit dvěma způsoby – Nejméně jedním prázdným řádkem. – Pomocí příkazu \par • Nový řádek - pro násilný přechod na nový řádek (Stiknutí enteru totiž nemá pro LaTex vliv) se používají příkazy – \newline – \linebreak – \\[velikost], kde volitelný parametr velikost udává, kolik místa se má vynechat. Může se zadat záporná hodnota. Velikost můžeme určit v mm, cm, in, ex, nebo pt. • Mezera - pro vysázení mezery existuje několik příkazů: – Vertikální mezery ∗ Vertikální mezera přesně dané velikosti se vysází pomocí příkazu \vspace{velikost}, kde velikost značí výšku dané velikosti. Tato forma, ale nevykreslí mezeru na začátku, nebo na konci stránky. Oproti tomu příkaz \vspace{velikost}, jenž má navíc hvězdičku, jí vysází vždy. ∗ Speciální vertikální mezera, která se vysází tak dlouhá, jak jen to je možné. Platí pro ní příkaz \vfill – Horizontální mezery ∗ Pro vysázení jednoslovné mezery se používá příkaz \_ ∗ Pro menší mezery, než je mezislovní, se používají příkazy: · \, · \quad · \qquad ∗ Pro mezery o velikosti jedné číslice se použije příkaz \enspace ∗ Mezera přesně dané velikosti se vysází pomocí příkaz \hspace{velikost}, kde velikost značí šířku dané velikosti. Tato forma, ale nevykreslí mezeru na začátku řádku. Oproti tomu příkaz \hspace{velikost}, jež má navíc hvězdičku jí vysází vždy. ∗ Speciální horizontální mezera, která se vysází tak dlouhá, jak jen to je možné. Platí pro ní příkaz \hfill 41
1. Analýza ∗ Je-li potřeba mezeru maximálně natáhnout a zároveň vyplnit tečkami, nebo čárou, se dá použít jeden z těchto příkazů: · \hrulefill - pro zaplnění čárou · \dotfill - pro zaplnění tečkami ∗ Je-li potřeba mezeru maximálně natáhnout a zároveň vyplnit šipkou se může jeden z těchto příkazů: · \leftarrowfill - šipka bude mít orientaci doleva · \dotfill - šipka bude mít orientaci doprava ∗ Pro vyplnění maximální mezery svorkami pak následují tyto příkazy: · \upbracefill · \downbracefill – Nezlomitelná mezera. Většinou se vkládá mezi předložku a další slovo. Pro použití se použije příkaz ∼ • Je-li potřeba stránku od začátku řádku odsadit, použije se příkaz \indent. Je-li to nežádoucí, použije se naopak příkaz \noindent.
1.3.5
Formátovací prostředí
Formátovací prostředí se dá chápat jako hromadné formátování delšího textu, u jehož se předpokládá nějaké uspořádání. Latex disponuje různými druhy prostředí, které se používají pro jednoduché utváření efektů. Největším prostředím je prostředí document, kterým musí každý text začínat. Definice prostředí je stejné a pro všechny prostředí platí, že musí začít tagem \begin{povinnéPar.} a končit tagem \end{povinnéPar.}. Uvedené parametry v počátečním tagu a koncovém tagu musejí být stejná. Prostředí se nesmí překrývat. Mohou se však do sebe vnořovat. • Výčtová prostředí – Enumerate je prostředí, které umožňuje zadávání číslovaných položek. – Itemize je prostředí, které umožní k položkám přidat nějaký neliterální symbol (např. Puntík). Pro představu je pomocí itemize vytvořen tento výčet prostředí. – Description, prostředí pro sazbu popisných výčtů. Používá se například pro encyklopedické výklady. – Trivlist je nejjednodušší prostředí, které je funkčností stejný jako enumerate, nebo itemize. S tím rozdílem, že nevkládá před položky žádné číslo, nebo symbol. 42
1.3.
TEX a LATEX
– List je nejobecnější výčtové prostředí, z něhož můžou být ostatní odvozena. Pomocí dvou parametrů, jež první určuje formování znaku a druhý formátování, můžeme docílit libovolného výčtového prostředí. K druhému parametru se nastavuje i parametr odsazení: ∗ ∗ ∗ ∗ ∗ ∗
\Rightmargin - nastavuje odsazení od pravého kraje \Leftmargin - nastavuje odsazení od levého kraje \Parsep - určuje vzdálenost mezi odstavci jedné položky \Itemsep - určuje vzdálenost od návěští k textu položky \Listparident - nastavuje odsazení odstavce \Labelwidt - slouží k určení šířky návěští
– Prostředí thebibliography se používá pro sazbu použité literatury. Toto prostředí je použito na konci diplomové práce v sekci "Použitá literatura" – Prostředí theindex se používá k vytváření rejstříků. • Sloupcová prostředí – Tabular je prostředí, kterým můžeme tvořit libovolné tabulky, včetně viditelných čar oddělujících buňky. – Tabbing je v podstatě tabular, akorát jsou zde čáry, jež oddělují buňky neviditelné. • Textová prostředí – Quote se používá pro vysázení krátkého citátu. – Quotation je stejné jako quote s tím rozdílem, že je odsazen první řádek odstavců. – Flushleft je klasické zarovnání doleva – Flushright je obdobné zarovnání doprava – Center je zarovnání na střed – Verse je prostředí pro sazbu veršů – Verbatim je prostředí, které nepodléhá formátování. Hodí se například pro výpis zdrojového kódu. – Minipage, prostředí chovající se jako malá stránka. • Plovoucí prostředí v Textu můžeme narazit na objekty, které nemají přesné umístění. K těmto objektům se používá tzv. plovoucí prostředí. Používá se převážně pro obrázky a tabulky. Pomocí plovoucích objektů jsou vysázeny obrázky a tabulky v této diplomové práci. Z důvodů typografických konvencí nevadí, když je obrázek umístěn jinde, než bylo původně zamýšleno. 43
1. Analýza Tabulka 1.3: Demonstrační tabulka buňka11 buňka21
buňka12 buňka22
– figure - plovoucí obrázek. ∗ ∗ ∗ ∗
K použití plovoucího obrázku je zapotřebí balíček graphicx. Požadovaný obrázek se umístí mezi \begin{figure} a \end{figure}. Vysázení obrázku pomocí příkazu \includegraphics{NázevObrázku}. Chceme-li na obrázek odkazovat z textu, použijeme příkaz \ref{fig:NázevObrázku}.
– table - plovoucí tabulka ∗ Požadovaná se umístí mezi \begin{table} a \end{table}. ∗ Pro nastavení zarovnání v tabulce se musí vnořit ješte jedna begin-end dvojice. A to dvojice \begin{tabular}{| z | z |} a \end{tabular}, kde | označuje existenci vertikálních rámečků a z je parametr zarovnání, který může nabývat hodnoty: · l - pro zarovnání sloupce doleva, · r - pro zarovnání sloupce doprava, · c - pro zarovnání sloupce na střed. ∗ Obsah tabulky je potom ve tvaru: \hline buňka11 & buňka12 \\ buňka21 & buňka22 \\ \hline , kde \hline označuje existenci horizontálních rámečků, & odděluje sloupce a \\ řádky. Příklad této tabulky je vyobrazen na této demonstrační tabulce 1.3. ∗ Chceme-li na tabulku odkazovat z textu, použijeme příkaz \ref{tab:NázevTabulky}.
1.3.6
Písmo
• Rodina písma – pro deklaraci nové rodiny písma se použije příkaz \DecklareFontFamily {kódování}. – pro definici potom \DecklareFontShape {kódování} {jméno rodiny} {váha} {tvar} {seznam velikostí a jméno souboru}. • Velikost písma - k nastavení velikosti písma slouží tyto příkazy, seřazené od nejmenšího, k nejvěšímu písmu. – \tiny – \scriptsize – \footnitesize 44
1.3.
TEX a LATEX
– \small – \normalsize – \large – \Large – \LARGE – \huge – \Huge • Zvýraznění písma- běžně používané písmo bez zvýraznění se nazývá antikva. Pomocí jednoduchých příkazů však toto písmo můžeme zvýraznit. – Pro zvýraznění pasáží textu, citátů apod. se používá tzv. italika, neboli kurzíva. Je to písmo skloněné na pravou stranu a je mírně užší než antikva. Více připomíná rukpis. Pro toto zvýraznění můžeme použít příkaz, nebo prostředí. ∗ Kurzíva jako prostředí - \begin{it}...\end{it}. ∗ Kurzíva jako příkaz - \it. – Další možností zvýraznění je podtržení. Opět má i toto zvýraznění dva možné způsoby zápisu. ∗ Podtržení jako prostředí - \begin{underline}...\end{underline}. ∗ Odtržení jako příkaz - \underline. – Poslední nezbytnou možností zvýraznění je tučné písmo, jež se dá opět zapsat dvěma způsoby. ∗ Tučné písmo jako prostředí - \begin{bf}...\end{bf}. ∗ Tučné písmo jako příkaz - \bf. Příkazové způsoby jsou zastaralé, ale přesto kompatibilní. Všechny tyto zvýraznění se dají kombinovat. Například pro tučné, podtržené písmo s kurzívou by to bylo: \it{\underline{\bf{ TEXT}}}. • Explicitní nastavení písma - Chceme-li dodatečně přenastavit samostatné atributy daného písma, dají se použít tyto příkazy: – Pro explicitní kódování se použije příkaz \fontencoding{kódování}. – Pro explicitní nastavení fontu se použije příkaz \fontfamily{rodina}. – Pro explicitní váhu písma se použije příkaz \fontseries{váha}. – Pro explicitní tvar písma se použije příkaz \fontshape{tvar}. – Pro explicitní velikost písma se použije příkaz \fontsize{tvar}.
45
KAPITOLA
2
Návrh konverze 2.1
Návrh převodu
Jelikož z předchozí kapitoly známe veškeré potřebné informace k převodu, můžeme navrhnout převodník. Z analýzy vyšlo také najevo, že převod se musí provádět po znacích (popsáno v kapitole 1.1.1). V následujícíh podkapitolách se zaměříme na návrh převodu z objektového modelu MS Word 2003 (popsán v kapitole 1.1) do výstupního souboru v LATEX (popsán v kapitole 1.3) formě prostřednictvím VBA (popsán v kapitole 1.2).
2.1.1
Princip
Celý dokument procházíme (prostřednictvím VBA For each cyklu) jednou a u každého znaku sledujeme jeho atributy. Pro každý znak vyhodnocujeme jeho atributy a jejich změny vůči předchozímu znaku, a ty převádíme do výstupní reprezentace ve formě LATEX. Pro veškeré demonstrace bude používán objekt, jež jsme příhodně pojmenovali Char, typu Character, jež je součástí kolekce Characters (popsáno v kapitole 1.1.1).
2.1.2
Registr příznaků
Pro uchování příznaků si musí převodník vytvořit tzv. registr příznaků. Zaznamenáli dejme tomu, že je právě zkoumaný znak tučný a bude třeba jej zobrazit na výstup, musí vědět, zda tato změna již na výstupu provedena nebyla. Kdyby jsme vypisovali LATEX příkaz pro tučnost před každým tučným znakem, byl by výstup nepřehledný, mnohonásobně by se zvětšil a navíc by takovéto zpracování bylo velmi pomalé. Vytvořili jsme proto ve VBA jednoduchou datovou strukturu formou pole, které uchovává příznaky, zda byl daný příkaz jiz použit. Díky tomu, že existují i párové LATEX příkazy, nemusíme pro každý znak definovat danou změnu, ale můžeme ho pomocí značek {} uzavřít do bloku, 47
2. Návrh konverze kde se automaticky změna projeví na všech znacích. V rámci všech příkazů tedy budeme mluvit o otevírání bloku { a o uzavírání bloku }. Aby byla dodržena syntaxe LATEX formátu, musíme zároveň hlídat, aby každý otevřený blok byl nakonec také zavřen.
2.1.3
Atributy textu
Tučné písmo Detekujeme ho tak, že testujeme, zda metoda Char.Bold vrací hodnotu -1. Pokud ano, nahlédneme do registru příznaků, zda příkaz již nebyl otevřen. Pokud otevřen byl, neděje se nic. Pokud otevřen nebyl, otevře se (Do výstupního souboru se zapíše \textbf{). Testovat, zda je písmo tučné však nestačí. Musíme testovat i zda písmo tučné není. Jestliže tedy metoda Char.Bold nevrátí hodnotu -1 je zřejmé, že písmo tučné není. Jestliže písmo tučné není, mohou nastat dvě možnosti. Pokud příkaz otevřen (viz. registr příznaků) nebyl a písmo tučné není, nic se neděje. Pokud však příkaz otevřen byl, zavře se (Do výstupního souboru se zapíše }). Popsaná demonstrace je pro přehlednost znázorněna na následujícím vývojovém diagramu 2.1. Písmo typu Italic Detekujeme ho tak, že testujeme, zda metoda Char.Italic vrací hodnotu -1. Pokud ano, nahlédneme do registru příznaků, zda příkaz již nebyl otevřen. Pokud otevřen byl, neděje se nic. Pokud otevřen nebyl, otevře se (Do výstupního souboru se zapíše \textit{) . Testovat, zda je písmo typu Italic však nestačí. Musíme testovat i zda písmo typu Italic není. Jestliže tedy metoda Char.Italic nevrátí hodnotu -1 je zřejmé, že písmo typu Italic není. Jestliže písmo typu Italic není, můžou nastat dvě možnosti. Pokud příkaz otevřen (viz. registr příznaků) nebyl a písmo není typu Italic, nic se neděje. Pokud však příkaz otevřen byl, zavře se (Do výstupního souboru se zapíše }). Popsaná demonstrace je pro přehlednost znázorněna na následujícím vývojovém diagramu 2.2. Podtržené písmo Detekujeme ho tak, že testujeme, zda metoda Char.Underline vrací hodnotu 1. Pokud ano, koukneme se do registru příznaků, zda příkaz již nebyl otevřen. Pokud otevřen byl, neděje se nic. Pokud otevřen nebyl, otevře se (Do výstupního souboru se zapíše \underline{). Testovat, zda je písmo podtržené však nestačí. Musíme testovat i zda písmo podtržené není. Jestliže tedy metoda Char.Underline nevrátí hodnotu 1 je zřejmé, že písmo podtržené není. Jestliže písmo podtržené není, můžou nastat dvě možnosti. Pokud příkaz otevřen (viz. registr příznaků) nebyl a písmo není typu Underline, nic se neděje. Pokud však příkaz otevřen byl, zavře se (Do výstupního souboru se zapíše }). 48
2.1. Návrh převodu
Detekce tučného písma
[ne]
[ano] Char.Bold = -1
[ano]
[ne] Flags[Bold] = 1
Flags[Bold] = 1
Výstup=Výstup+"}"
Výstup=Výstup+"\textbf{"
Konec detekce
Obrázek 2.1: Detekce tučného textu
Popsaná demonstrace je pro přehlednost znázorněna na následujícím vývojovém diagramu 2.3. Barva písma Barvu písma detekujeme pomocí metody Char.Font.Color, jež vrací přímo číselný výraz barvy ve 4 bytech ve formátu 00BBGGRR, kde R je obsažení červené v rozmezí od 0-255, G je obsažení zelené v rozmezí od 0-255 a N je obsažení modré v rozmezí od 0-255. Pro výstupní zobrazení však neexistuje dvou párový blokový příkaz, ale pouze příkaz nepárový, který definuje změnu barvy od vložení příkazu do konce formátovaného celku. Aby jsme příkaz nevkládali při každém znaku, využijeme opět registr příznaků, který si ovšem místo příznaku otevření bude pamatovat hodnotu poslední barvy. V případě, že se bude barva vůči předchozímu znaku lišit, stane se následující: 1. Jelikož LATEXový příkaz, jež nastavuje barvu textu se musí deklarovat v hlavičce dokumentu, musíme nejdřív vytvořit tuto definici. 49
2. Návrh konverze
Detekce italic písma
[ne]
[ano] Char.Italic = -1
[ano]
[ne] Flags[Italic] = 1
Flags[Italic] = 1
Výstup=Výstup+"}"
Výstup=Výstup+"\italic{"
Konec detekce
Obrázek 2.2: Detekce Italic textu
2. Nejdříve zjistíme, zda definice již neexistuje, k tomuto účelu využijeme datovou strukturu pole, do které vytvořené definice budeme ukládat. 3. Pokud Definice existuje, vezme se její index a do výstupního souboru se zapíše \color{index}. 4. Pokud Definice neexistuje, vytvoří se tak, že se do výstupního souboru zapíše tento příkaz \definecolor{index}{rgb}, následně se uloží do pole definic a nakonec se do výstupního souboru zapíše obdobně jako by tomu bylo v předchozím bodě \color{index}. Popsaná demonstrace je pro přehlednost znázorněna na následujícím vývojovém diagramu 2.4. Zvýraznění písma Postup je zde stejný jako tomu bylo u získávání barvy písma. S tím rozdílem, že barvu získáváme pomocí metody Char.HighlightColorIndex a že do 50
2.1. Návrh převodu
Detekce podtrženého písma
[ne]
[ano] Char.Underline = 1
[ano]
[ne] Flags[Underline] = 1
Flags[Underline] = 1
Výstup=Výstup+"}"
Výstup=Výstup+"\underline{"
Konec detekce
Obrázek 2.3: Detekce podtrženého textu
výstupního souboru se zapíše příkaz \colorbox{index}.
Velikost písma Velikost znaku detekujeme pomocí metody Char.Font.Size, jež vrací velikost znaku udanou v pointech. Získanou velikost potom zapisujeme do výsledného souboru tímto příkazem \fontsize {Char.Font.Size pt}{0pt}\selectfont. Jelikož se opět jedná o nepárový příkaz, jako tomu bylo s barvou, je dobré pamatovat si předchozí velikost znaku a příkaz vypisovat pouze, dojde-li ke změně.
2.1.4
Formátování textu
LATEX má předefinované chovaní pro rozložení textů, odstavců a dalších objektů. Detekujeme-li jiné uspořádání než standartní, musí se do výstupního souboru zapsat explicitně. 51
2. Návrh konverze
Detekce barvy
Je barva Char.Font.Color již nadefinována?
Zjistí se index definované barvy
Výstup=výstup+"\definecolor{index}{Char.Font.Color}"
Výstup=výstup+"color{index}"
Konec detekce
Obrázek 2.4: Detekce barvy textu
Zarovnání textu Zda je text zarovnán doleva, doprava, do bloku, či na střed zjistíme pomocí metody Char.ParagraphFormat.Alignment která vrací číselnou hodnotu v rozmezí 0-3. • 0 - zarovnání doleva, jestliže metoda vrátí tuto hodnotu a registr příznaků udává, že je příkaz jiz otevřen, nic se neděje. V opačném případě se příkaz otevře, registr příznaku zarovnání doleva se nastaví a do výstupního souboru se vypíše: \begin{flushleft}. Všechny ostatní příznaky se nastaví na 0 a v případě jejich otevření se uzavřou výpisem } • 1 - zarovnání doprava, jestliže metoda vrátí tuto hodnotu a registr příznaků udává, že je příkaz jiz otevřen, nic se neděje. V opačném případě se příkaz otevře, registr příznaku zarovnání doprava se nastaví a do výstupního souboru se vypíše: \begin{flushright}. Všechny ostatní pří52
2.1. Návrh převodu znaky se nastaví na 0 a v případě jejich otevření se uzavřou výpisem } • 2 - zarovnání na střed, jestliže metoda vrátí tuto hodnotu a registr příznaků udává, že je příkaz jiz otevřen, nic se neděje. V opačném případě se příkaz otevře, registr příznaku zarovnání na střed se nastaví a do výstupního souboru se vypíše: \begin{flushcenter}. Všechny ostatní příznaky se nastaví na 0 a v případě jejich otevření se uzavřou výpisem }. • 3 - zarovnání na blok, jestliže metoda vrátí tuto hodnotu a registr příznaků udává, že je příkaz jiz otevřen, nic se neděje. V opačném případě se ukončí všechny ostatní příkazy zarovnání. Jakmile není spuštěn žádný příkaz, LATEX zarovnává defaultně text do bloku. Popsaná demonstrace je pro přehlednost znázorněna na následujícím vývojovém diagramu 2.5. 2.1.4.1
Výčet
Zda je na text použito výčtové prostředí zjistíme pomocí metody Char.ListParagraphs.Count. Jestliže tato metoda nevrací nulovou hodnotu, je text formátován jako výčtové prostředí. Ve Wordu je možné použít dva druhy výčtového prostředí. • Číslovaný - Zda je výčet číslovaný, zjistíme pomocí metody Char.ListType. Vrací-li tato metoda hodnotu "wdListSimpleNumbering", je zřejmé, že se jedná o číslovaný výčet. Jestliže registr příznaků udává, že je příkaz již otevřen, nic se neděje. V opačném případě se příkaz otevře, do registru příznaků číslovaného výčtu se nastaví a do výstupního souboru se vypíše: \begin{enumerate} a za ním bude následovat: \item kterým dáváme najevo, že se rovnou do výčtu bude zapisovat. • Nečíslovaný - Zda je výčet nečíslovaný zjistíme pomocí metody Char.ListType. Vrací-li tato metada hodnotu "wdListBullet" je zřejmé, že se jedná o nečíslovaný výčet. Jestliže registr příznaků udává, že je příkaz již otevřen, nic se neděje. V opačném případě se příkaz otevře, do registru příznaků nečíslovaný výčtu se nastaví a do výstupního souboru se vypíše: \begin{itemize} a za ním bude následovat: \item kterám dáváme najevo, že se rovnou do výčtu bude zapisovat. Tím však je vyřešena pouze první položka výčtu. Další položka se pozná podle symbolu nového řádku (viz. další podkapitola). Bude-li zaznamenán tento symbol a zároveň je příkaz výčtu stále otevřený, víme, že bude následovat další položka výčtu. Pro další položku se použije opět příkaz \item, který vypíšeme do výstupního souboru. Pro oba výčty platí, že jakmile je detekováno, 53
2. Návrh konverze
Detekce zarovnání
[=0]
[=1] Char.ParagraphFormat.Alignment
[=3]
[=2] Uzavření všech otevřených zarovnání
Uzavření všech otevřených zarovnání
Výstup=Výstup+"\begin{flushleft}"
Uzavření všech otevřených zarovnání
Výstup=Výstup+"\begin{flushcenter}"
Uzavření všech otevřených zarovnání
Výstup=Výstup+"\begin{flushright}"
Konec detekce
Obrázek 2.5: Detekce zarovnání
že metoda Char.ListParagraphs.Count vrací 0, uzavřou se a nastaví se příznaky do registru příznaků. Pro odrážkový výčet se do výstupního souboru zapíše: \end{itemize} a pro číselný výčet: \end{enumerate}. Pro oba výčty zároveň platí, že mohou být víceúrovňové. Hloubka zanoření se pozná podle hodnoty, kterou vrací metoda pChar.ListFormat.ListLevelNumber. Jeli vrácená hodnota jedna, jedná se o kořenovou úroveň, je-li hodnota devět, jedná se o nejhlubší vnoření. Pro úrovně jsme vytvořili následující pravidlo. Je-li nově vytvořená úroveň hlubší, než předchozí, nic se neděje, příkaz se otevře a zaznamená do registru příznaků bez toho, aniž by se předchozí úroveň uzavřela. Je-li tomu naopak a hlubší byla předchozí úroveň, předchozí úroveň se uzavře. Díky tomu bude zachována syntaxe otevření a uzavření bloku. Po54
2.1. Návrh převodu
Detekce výčtu
[ano]
[ne] Char.Paragraphs.count <> 0
[ne] Flag[L]=1
[ano]
Všechny otevřené výčty se uzavřou pomocí příkazu: Výstup:Výstup+"\end{enumerate/itemize}"
Char.ListFormat.ListLevelNumber > předchozí
[ne]
[ano]
Uzavře se předchozí úroveň pomocí příkazu: Výstup:Výstup+"\end{enumerate/itemize}" [wdListSimpleNumbering]
Char.List.Type [wdListBullet]
Výstup=výstup+"\begin{enumerate}"
Výstup=výstup+"\begin{itemize}"
[ano] Nový řádek [ne] Výstup=výstup+"\item"
Konec detekce
Obrázek 2.6: Detekce výčtu
psaná demonstrace je pro přehlednost znázorněna na následujícím vývojovém diagramu 2.6. Nový řádek Nový řádek detekuje tak, že si vezmeme hodnotu metody objektu Char, která vrací znak daného objektu. Jestliže číslo dané hodnoty v ASCII tabulce je 13, vložíme do výstupního souboru tento nepárový příkaz: \newline 55
2. Návrh konverze
2.1.5
Styl textu a nadpisy
Jelikož řešíme vzhled konkrétního znaku, nemusí nás styly, jež může uživatel v MS Wordu použít, zajímat. Zajímají nás však vzhledem k nadpisům. Nadpisy jsou totiž v MS Word definovány pomocí stylů. Jelikož si uživatel může styly pojmenovat, nastává zde problém, jak jednoznačně rozpoznat nadpis. Uživatel si totiž defaultní názvy pro nadpisy může předělat, nebo může používat jinou jazykovou verzi. Řešením je, že si uživatel při spuštění aplikace může určit, jak jsou styly definující nadpisy pojmenované. Pokud tak neučiní, použijí se pro převod styly s názvem Nadpis 1 až Nadpis 5. Z textu potom poznáme, zda se jedná o daný nadpis pomocí metody Char.style. Jestliže se hodnota, jež tato metoda vrací, bude shodovat s názvem z některého z nadpisů, určíme, že se jedná o nadpis. Jestliže v registru příznaku nebude zaznamenáno, že je již příkaz otevřen, otevře se, příznak se zapíše do registru a do výstupního souboru se zapíše: • \section{, jedná-li se o nadpis nejvyšší úrovně. • \subsection{, jedná-li se o nadpis druhé úrovně. • \subsubsection{, jedná-li se o nadpis třetí úrovně. • \paragraph{, jedná-li se o nadpis čtvrté úrovně. • \subparagraph{, jedná-li se o nadpis páté úrovně. Jestliže, bude detekováno, že znak není stylem a v registru příznaků bude nějaký nadpis otevřen, tak se pomocí příkazu } ukončí a registr příznaků pro nadpisy se nastaví na signalizaci zavřeného příkazu. Popsaná demonstrace je pro přehlednost znázorněna na následujícím vývojovém diagramu 2.7.
2.1.6
Znaková sada
Při zavolání metody Char.Text můžeme zjistit hodnotu znaku v UNICODE kódování. Nejjednoduší rešení je do výstupního souboru tuto hodnotu rovnou vypsat. Může se však stát, že tento LATEX dotyčný symbol znát nebude. Proto je zapotřebí převodní tabulka, která bude řešená hashovací tabulkou. Index hashovací tabulky bude znak, který chceme přeložit a hodnota hashovací tabulky bude vracet znak v LATEX podobě. Tuto tabulku však musíme sami nejdříve naplnit. Jelikož Word používá kódování UNICODE znaků ve schématu USC-2, může nastat i situace, že znak bude obsažen ve dvou slovech. Takovýto znak poznáme podle toho, že metoda Len(Char.text) bude vracet hodnotu větší než jedna (znak je zakódován do dvou částí). Výslednou UNICODE hodnotu takto rozpoznaného znaku získáme sloučením bitových polí z obou částí. Celá situace je pro přehlednost znázorněna na vývojovém diagramu 2.8. 56
2.1. Návrh převodu
Detekce nadpisů
[ano]
Char.Style = "Nadpis 1"
[ne]
[ano]
[ne] Char.Style = "Nadpis 2"
[ano]
Char.Style = "Nadpis 3"
[ano]
[ne]
Char.Style = "Nadpis 4"
[ne]
[ne]
[ano] Char.Style = "Nadpis 5" Výstup=Výstup+"\paragraph{"
Výstup=Výstup+"\subsubsection{"
Výstup=Výstup+"\subparagraph{"
[ne]
Výstup=Výstup+"\subsection{"
Flag[N1|N2|N3|N4|N5]=1
Výstup=Výstup+"\section{"
Výstup=Výstup+"}" Konec detekce
Obrázek 2.7: Detekce nadpisů
57
[ano]
2. Návrh konverze
Detekce znaků
[ne]
[ano] Len(Char.Text) > 1
[ano]
LaTeX umí zobrazit znak bez dodatečného příkazu
[ne]
Rozdělení na dvě části
Získání hodnoty z obou částí
Znak se ponechá Sloučení obou částí
Převedení na LaTeX příkaz pomocí hashovací tabulky
Konec detekce
Obrázek 2.8: Detekce znaků
2.1.7
Definice tabulky
Zda je znak součástí tabulky, zjistíme díky metodě Char.Tables.count, která vrací počet tabulek, jež je znak součástí. Vrátí-li tato metoda jinou hodnotu než je nula a zároveň bude-li registr příznaků tabulky vracet informaci o tom, že příkaz není otevřen, vypíše se do výstupního souboru příkaz \begin{tabular}, který definuje, že se bude vykreslovat tabulka. Dále pak musí následovat příkaz {z,z,z...}, který určuje, jak se sloupce budou zarovnávat. Příkaz zarovnání budeme postupně vyplňovat podle první buňky v sloupci. Zarovnání pro danou buňku zjistíme díky metodě Char.ParagraphFormat.Alignment, která může vrátit hodnotu od 0 do 3. • 0 - zarovnání doleva. Bude li v prvním řádku v x-tém sloupci tato hodnota, nastaví se v příkazu {z,z,z...} hodnota l na x té místo. • 1 - zarovnání doprava. Bude li v prvním řádku v x-tém sloupci tato hodnota, nastaví se v příkazu {z,z,z...} hodnota r na x té místo. • 2 - zarovnání na střed. Bude li v prvním řádku v x-tém sloupci tato hodnota, nastaví se v příkazu {z,z,z...} hodnota c na x té místo. 58
2.1. Návrh převodu • 3 - zarovnání na blok. Jelikož LATEX zarovnání na blok nepodporuje, použije se zarovnání na střed popsané v předchozím případě. Obsah tabulky U vytváření obsahu používáme tyto dvě metody. Char.Cells(1).ColumnIndex, jež značí index sloupce a Char.Rows(1).Index, jež značí index řádku. Aby jsme poznali, zda se znak nenachází již v dalším řádku, nebo sloupci, musíme si pamatovat předchozí indexy. Pokud bude se bude index sloupce současného znaku oproti indexu sloupce předchozího znaku lišit, vložíme do výstupního souboru příkaz &, který LATEX informuje o tom, že má vykreslit další sloupec. Pokud se bude index řádku současného znaku oproti indexu řádku předchozího znaku lišit, vložíme do výstupního souboru příkaz \\, který LATEX informuje o tom, že má vykreslit další řádek. V případě, že metoda Char.Tables.count bude vracet nulu a registr příznaku tabulky bude pozitivní, tabulka se tímto příkazem \end{tabular} uzavře. Uzavření se poté zaznamená do registru příznaků. Zarovnání sloupců zjišťujeme průběžně, má však být napsané na začátku příkazu. Proto je výstupní text rozdělen na hlavičku a tělo. Do hlavičky se ukládají zarovnání sloupců a do těla obsah. Při zavírání příkazu, se hlavička a obsah spojí a vypíšou se do výstupního souboru. Popsaná demonstrace je pro přehlednost znázorněna na následujícím vývojovém diagramu 2.9.
2.1.8
Vyexportování a definice grafických objektů
Grafické objekty jsou obrázky, grafy, ale i matematické rovnice. Export grafických objektů z vnitřní reprezentace vstupního textového dokumentu je velmi obtížný. Byly nalezeny tři teoreticky možná řešení. • Uložení grafického objektu do objektu graf a následné použití metody export(). • Použití knihoven MS Power Point a následné použití metody export(). • Uložení stránky jako HTML. Uložení grafického objektu do objektu graf a následné použití metody export(). Tato metoda spočívá v tom, že si aplikace převede grafický objekt na objekt graf, kde následně použije VBA metodu export(), jež má objekt graf k dispozici. Jsou tu však tři problémy. 1. Metoda export() je již zastaralá a v manuálu k VBA se můžeme dočíst doporučení, že by se již neměla používat. 2. Z jednoduchého objektu se zbytečně stává objekt složitější. 3. Tato metoda je celkově velmi pomalá. 59
2. Návrh konverze
Detekce tabulky
[ne]
[ano] Char.Tables.count > 0
[ano]
[ano]
[ne] Flags[table]=0
Flags[table]=1 [ne]
[ano] Hlavička=Hlavička+"\begin{tabular}{"
Char.Cells(1).ColumnIndex <> předchozí
Tělo=Tělo+"&"
Výstup=Výstup+Hlavička+"}" +Tělo+"\end{tabular}" [ne]
[ne]
[ano] První řádek
[ne] Char.Rows(1).Index <> předchozí
[ano]
[0,3] Char.ParagraphFormat.Alignment
[1]
[2] Hlavička=Hlavička+"c" Hlavička=Hlavička+"r" Hlavička=Hlavička+"l"
Tělo=Tělo+Char Konec detekce
Obrázek 2.9: Detekce tabulky
60
Tělo=Tělo+"\\"
2.1. Návrh převodu Použití knihoven MS Power Point a následné použití metody export(). Tato metoda spočívá v tom, že se přidá knihovna podporující práci s MS Power Point, dokument se uloží jako soubor spustitelný v MS Power Point a tím získá grafický objekt metodu export(). Jsou tu však čtyři problémy. 1. Převodem do MS Power Pointu může přijít grafický objekt o některé vlastnosti. 2. Metoda export() je již zastaralá a v manuálu k VBA se můžeme dočíst doporučení, že by se již neměla používat. 3. Z jednoduchého objektu se zbytečně stává objekt složitější. 4. Tato metoda je celkově velmi pomalá. Uložení stránky jako HTML. Tato metoda je ze všech tří nejefektivnější. Definice grafického objektu na výstup Pro definici objektu je potřeba znát jeho dva parametry. Umístění obrázku a jeho název. Jelikož z předchozí úvahy víme, kam se obrázky ukládají. Známe jejich umístění. Název zjistíme tak, že zkoumáme, zda metoda Char.InlineShapes.count aktuálního znaku vrací nenulovou hodnotu. Pokud ano, znak je součástí obrázku. Zároveň si udržujeme čítač vypsaných obrázků. Díky tomu víme, že má-li čítač hodnotu 3, že vypisujeme třetí obrázek a že bude ve složce umístění na třetím pořadí. Název zjistíme podle názvu souboru. Příkaz, jež vypíšeme do výstupního souboru má tuto podobu: \begin{figure} \includegraphics{cestaKSouboru}\label{fig:názevSouboru}\end{figure} . Kde text napsaný kurzívou jsou parametry, které jsme získali v předchozí úvaze. Popsaná demonstrace je pro přehlednost znázorněna na následujícím vývojovém diagramu 2.10.
2.1.9
Odkazy
Každý odkaz funguje tak, že vytvoříme jeho label(jmenovku) a poté na něj odkudkoliv pomocí reference odkazujeme. V MS Word může uživatel vytvořit čtyři druhy odkazů. 1. Poznámku pod čarou. 2. Titulek. 3. Křížový odkaz. 4. odkaz na web. 61
2. Návrh konverze
Detekce grafického objektu Uložení souboru jako html
[ano]
[ne] Char.InlineShapes.count<>0
Výstup=výstup+"\begin{figure}\includegraphics\{cestaKSouboru} \label\{fig:názevSouboru}\end{figure} "
Výstup=výstup+"\ref{fig:názevSouboru}"
Čítač=čítač+1
Konec detekce
Obrázek 2.10: Detekce grafického objektu
Poznámku pod čarou Zda se v textu objeví znak odkazující na text, jež je umístěn pod čarou zjistíme pomocí metody Char.Footnotes.count. Vrací- li nenulovou hodnotu, znamená to, že je symbol odkazuje na text pod čarou. V případě, že je registr příznaku odkazu pod čarou není aktivní, spustíme příkaz \footnote{, jež signalizuje, že následující text bude vyobrazen pod čarou. Následovat bude text, který zjistíme pomocí metody Char.Footnotes.Item(1).Range.Text. Jestliže vrací Char.Footnotes.count nulovou hodntou a registr příznaku odkazu je nastaven na otevřen, příkaz se zavře }. LATEX automaticky vytvoří referenci tam, kde byl příkaz zavolán. Odkaz bude mít číselnou hodnotu podle toho, kolikátý je pořadově v dokumentu. Pro tuto potřebu si udržujeme čítač. Popsaná demonstrace je pro přehlednost znázorněna na následujícím vývojovém diagramu 2.11. Titulek Titulek, neboli label je popis prvku (prvkem rozumíme tabulku, obrázek, nadpis, nebo rovnici), jež se pod (nebo nad) daným prvkem nachází. U daného prvku můžeme vytvořit label, díky kterému můžeme na daný prvek odkazo62
2.1. Návrh převodu
Detekce poznámky pod čarou [ne]
[ano] Char.Footnotes.count<>0
[ano]
[ne]
[ne]
Flags[F]=0
Flags[F]=1
Výstup=Výstup+"}"
Výstup=Výstup+ "\footnote{Char.Footnotes.Item(1).Range.text}"
Čítač=čítač+1
Konec detekce
Obrázek 2.11: Detekce poznámky pod čarou
vat. Jedná se o příkaz \label{názevLabelu}. Label rozpoznáme pomocí metody char.style. Pokud nám tato metoda vrátí označení labelu pro danou jazykovou verzi (v případě češké jazykové verze to bude Titulek, v případě anglické jazykové verze to bude Title), víme, že se jedná o label. Pokud se tento label vyskytuje před daným prvkem, umístíme příkaz \label{názevLabelu} do horní části definice prvku (bude se vykreslovat nad prvkem). Pokud se label vyskytne až po prvku, umístíme příkaz \label{názevLabelu} do spodní definice prvku. Tímto zajistíme, zda se titulek bude vykreslovat pod prvkem, nebo nad. Parametr názevLabelu získáme přímo z textové hodnoty znaků, jež mají označení labelu (char.style = "Titulek"(pro českou jazykovou verzi)). Takto vytvořený titulek poté uložíme do datové struktury titulků v které zaznamenáváme název titulku, typ prvku a pořadí prvku. Tuto datovou strukturu poté používáme pro přiřazení referencí. Celý tento proces je znázorněn na následujícím vývojovém diagramu 2.12. Křížový odkaz Zda je znak křížový odkaz poznáme pomocí metody Char.Fields.Count. Bude-li metoda vracet hodnotu větší než 1, budeme vědět, že se jedná o referenci. To, na co reference odkazuje zjistíme pomocí metody char.Fields.item(1).Result.Text. Reference odkazuje na label (titulek), 63
2. Návrh konverze
Detekce titulku
label = Zjištění pojmenování labelu dle jazykové verze
[ne]
[ano] Char.Style = label
[ano] Flags[t]=1
Flags[t]=0
Flags[t]=1
Flags[t]=0
Přiřazení labelu k prvku labelName = labelName + char.Text Uložení do datové struktury titulků
Konec detekce
Obrázek 2.12: Detekce titulku
jenž je umístěn v definici prvku, na něhož se chceme odkazovat. To na jaký konkrétní prvek se reference odkazuje, zjistíme díky tomu, že si vedeme datovou strukturu titulků, ve které máme labely (titulky) nadefinované a popsané. Bude-li například metoda char.Fields.item(1).Result.Text vracet hodnotu "Obrázek 1 popis funkce", rozdělíme si daný text na: • typ prvku (v našem případě "obrázek") • pořadí prvku (v našem případě "1") • hodnota prvku (v našem případě "popis funkce") Pomocí těchto indicií dokážeme spolu s datovou strukturou titulků rozpoznat a provázat danou referenci s daným labelem prvku. 64
2.1. Návrh převodu
Detekce odkazu na web
[ne]
[ano] Char.Hyperlink.count<>""
[ne]
[ne]
[ano]
[ano] Flags[Cr]=1
Flags[Cr]=0
Výstup=Výstup+ "\url{Char.Hyperlink.Address}{"
Flags[Cr]=0
Výstup=Výstup+Slovo+"}"
Slovo=Slovo+Char
Slovo=""
Konec detekce
Obrázek 2.13: Detekce odkazu na web
Odkaz na web Zda znak odkazuje na web, zjistíme podle metody Char.Hyperlink.count. Vrací-li nenulovou hodnotu, jedná se o odkaz. Je-li registr příznaku URL odkazu negativní (příkaz doposud nebyl spuštěn), spustí se příkaz \url{}{ a registr přiznaku URL odkazu se nastaví na otevřený stav. Jako parametr příkazu url bude adresa na kterou se má odkazovat. Tuto adresu zjistíme z metody Char.Hyperlink.Address. Druhým parametrem je description, který určuje, jak se odkaz má jmenovat. Description vytvoříme podle řady souvislých znaků, kterým vrací metoda Char.Hyperlink.count nenulovou hodnotu. Jakmile bude hodnota této metody nulová, příkaz se ukončí. Popsaná demonstrace je pro přehlednost znázorněna na následujícím vývojovém diagramu 2.13.
2.1.10
Rovnice
Zpracování rovnice probíha v několika fázích: • Rozpoznání prvního znaku rovnice 65
2. Návrh konverze • Lineralizace • Převod do normálního textu • Převod do LATEXu • Rozpoznání posledního znaku rovnice • Převod do matematického textu • Vytvoření rovnice • Vypsání na výstup 2.1.10.1
Rozpoznání prvního znaku rovnice
Zda je znak součástí rovnice poznáme podle metody char.Omath.count. Pokud tato metoda vrací hodnotu větší než nula, jedná se o rovnici. Vrací-li metoda hodnotu nula a zároveň registr příznaku rovnic uchovává nulu, víme, že se jedná o první znak dané rovnice. Jedná-li se o první znak nastavíme registr rovnic na jedničku. 2.1.10.2
Lineralizace
Jelikož samotná rovnice je uchovávána v objektu, jež se tváří jako jeden celek, musíme jí nejdřív dostat do podoby, s kterou již umíme pracovat. Touto funkcí disponuje metoda char.OMaths.Linearize, jež nám rovnici převede do lineární podoby. Např. Po lineralizaci by rovnice 5+1 3+2 vypadala takto: (5+1)/(3+2) 2.1.10.3
Převod do normálního textu
Po lineralizace můžeme již rovnici procházet znak po znaku. Při zjištění UNICODE hodnot znaku však zjišťujeme, že se jedná o UNICODE znaky, jimiž LATEX nedisponuje. Musíme tedy znaky nejdříve převést do normální sady znaků, které již LATEX zná. Touto funkcí disponuje metoda char.OMaths.Item(1).ConvertToNormalText, jež převede text z matematické sady znaků, do normální sady znaků. 2.1.10.4
Převod do LATEXu
Znaky konvertujeme obdobně, jako by se jednalo o normální znaky (viz. kapitola Zpracování znaků 2.1.6). Během konverze můžeme narazit na různé druhy konstrukcí. Tabulka 2.1 znázorňuje výčet těchto konstrukcí včetně jejich příkladů. U každé konstrukce musíme zachovat její logiku. Během konverze můžeme z hlediska logiky narazit na tyto dva typy kostrukcí: • Konstrukce, jejichž logika je u LATEXu stejná. Např. 5-(1+n) je ve Wordu (po lineralizaci) i v LATEXu stejná. 66
2.1. Návrh převodu Tabulka 2.1: Mapovací tabulka konstrukcí rovnic Název konstrukce
příklad
po lineralizaci
v LATEX formátu
Zlomek Index Odmocnina
2+2 2+2 a2+2 √
(2+2)/(2+2) a_(2+2) √ (a+b)
\frac{2+2}{2+2} a_{2+2} \sqrt{a+b}
∫ _(+x)^(-x)x
\int_{+x}^{-x}x
∑_(i=0)^nn
\sum_{i=0}^nn
(a+b) sin−1 x lim
(a+b) sin^(-1)x lim_(x → ∞)
(a+b) sin^{-1}x \lim_{x\to\infty}
= ˆ
^=
\^=
1 0 0 1
∎(1&0@0&1)
\begin{array}{cc}1&0\\
a+b −x
Integrál
x
∫ +x
a atributů písma n
Velký operátor
∑n i=0
Závorka Funkce Limita a logaritmy Operátor a doplň. symbol Matice
x→∞
1&0 \end{array}
• Konstrukce, jejichž logika je rozdílná. Např. (5+1)/(2+3) (po lineralizaci) se v LATEXu znázorní takto: \frac{5+1}{2+3}. Tato logika je však rozdílná pouze v typu závorek a v tom, že identifikátor konstrukce (v tomto přípádě / (pro Word) a \frac (pro LATEX)) se místo ve středu nachází na začátku. Konstrukce, jejichž logika je rozdílná se dále dělí do dvou typů: – identifikátor konstrukce se nachází na začátku konstrukce. Např. 5_(5+1) (po lineralizaci). Po rozpoznání takovéto konstrukce se znak po znaku projde celá funkce směrem doprava od identifikátoru. První závorka se nachází ihned vedle identifikátoru konstrukce. Tuto závorku změníme na složenou závorku (aby odpovídala konstrukci LATEXu). Poté projdeme směrem doprava zbytek řetězce, dokud nenajdeme pravou závorku ve stejné úrovni vnoření jako levá závorka. Tuto závorku také změníme na složenou. Identifikátor v tomto typu konstrukce může zůstat na svém místě. – identifikátor konstrukce se nachází uvnitř konstrukce. Např. (5+1)/(1+3). U tohoto typu konstrukce se postupuje obdobně, jako u předchozího typu. Akorát s tím rozdílem, že hledání závorek probíhá nejdříve vlevo od identifikátoru konstrukce a poté napravo od identifikátoru konstrukce. Po nalezení levé i pravé strany (a jejich nahrazení za složené závorky) se identifikátor přesune na začátek konstrukce.
67
2. Návrh konverze 2.1.10.5
Rozpoznání posledního znaku rovnice
Jestliže metoda char.Omath.count bude vracet hodnotu rovné nule a zároveň se příznak rovnic bude rovnat jedničce, víme, že předchozí znak byl poslední a tudíž můžeme rovnici uzavřít. 2.1.10.6
Převod do matematického textu
Jelikož chceme nechat vstupní dokument zachován ve stejném stavu jako před konverzí, musíme inverzní funkcí změnit sadu znaků z normálního textu, na matematický. Tuto funkci zajišťuje metoda char.OMaths.Item(1).ConvertToMathText 2.1.10.7
Vytvoření rovnice
Aby byl zachován původní stav před konverzí, je potřeba ještě na rovnici použít inverzní funkci k funkci char.OMaths.Linearize. Touto inverzní funkcí je funkce OMaths.BuildUp. Tato funkce převede rovnici z lineární podoby do podoby rovnic. Po použití této funkce již rovnice vypadá naprosto stejně, jako před konverzí. Např. Po použití této funkce by rovnice (5+1)/(3+2) vypadala 5+1 takto: 3+2 2.1.10.8
Vypsání na výstup
Po rozpoznání posledního znaku a upravení rovnice do původního stavu, přidáme na začátek a na konec rovnice symbol dollaru $. LATEXu tak dáváme vědět, že se jedná o rovnici. Takto vytvořenou rovnici již vkládáme do výstupu.
2.2
Návrh chování aplikace
Pro popis chování aplikace jsme použili Unified Modeling Language, neboli UML diagramy, jež slouží k vizualizaci, specifikaci, navrhování a dokumentaci programových systémů. Diagramy jsou vytvořeny v programu Enterprise Architect. Zde je přehled nejpoužívanějších diagramů které pro popis použijeme. • Use case diagram - diagram případu užití. Zobrazuje chování systému z hlediska uživatele. Jeden z nejzákladnějším UML diagramů. V popisu této aplikace nezbytný. • State machine diagram - diagram stavového stroje. Vyjadřuje stavy určitého objektu a přechody mezi těmito stavy. V popisu této aplikace nezbytný. 68
2.2. Návrh chování aplikace
2.2.1
Diagram případů užití
Diagram případů užití, neboli Use case diagram zobrazuje chování systému z hlediska uživatele. Diagram znázorňuje : • co systém dělá (ne však, jak to dělá), • kdy a jak činnost začíná a končí, • kdy je systém v kontaktu s uživatelem, • které data jsou měněny, • jaké kontroly vstupu jsou prováděny, • základní, chybové a alternativní průběhy. U všech částí platí, že by měly být používány pouze pojmy dané rozsahem systému. Konkrétní Use Case diagram pro tuto aplikaci je navržen na diagramu 2.14. Případy užítí Spuštění aplikace • Vstupní podmínky: Uživatel chce spustit aplikaci • Tok událostí: 1. Není-li k dispozici, musí uživatel zadat vstupní soubor (případ užití - Vložení vstupního souboru). 2. Uživatel může změnit defaultní nastavení aplikace (případ užití Nastavení aplikace). 3. Je-li zadán soubor, uživatel může spustit převodník. • Následné podmínky: Uživatel může spustit převodník (případ užití Spuštění převodníku). Vložení vstupního souboru - není-li k dispozici • Vstupní podmínky: Uživatel chce vložit soubor. • Tok událostí: 1. Uživatel klikne na tlačítko vložit soubor. 2. Uživatel vybere umístění souboru. 3. Aplikace načte soubor. • Následné podmínky: Uživatel může spustit převodník (případ užití Spuštění převodníku). 69
2. Návrh konverze
Obrázek 2.14: Use case diagram
70
2.2. Návrh chování aplikace Nastavení aplikace • Vstupní podmínky: Uživatel chce změnit defaultní nastavení aplikace • Tok událostí: 1. Uživatel klikne na tlačítko nastavení. 2. Uživateli se zobrazí nabídka služeb 3. Uživatel může kliknout na nastavení hlaviček (případ užití - Spuštění nastavení hlaviček). 4. Uživatel může kliknout na umístění výstupního souboru (případ užití -Umístění výstupního souboru). 5. Uživatel se může vrátit zpět. • Následné podmínky: Aplikace uloží provedené změny. • Alternativní tok: Uživatel se může vrátit zpátky beze změn. Nastavení hlaviček - úrovní nadpisů • Vstupní podmínky: Uživatel chce změnit defaultní nastavení hlaviček. Hlavičkami jsou myšleny názvy stylů v MS word. Uživatel si může k názvům hlaviček přiřadit úroveň nadpisu. Aplikace pak díky tomu rozpozná, kterému nadpisu má dát jakou úroveň. • Tok událostí: 1. Uživatel klikne na tlačítko nastavení. 2. Aplikace nabídne uživateli výpis všech hlaviček. 3. Uživatel změní, co potřebuje. 4. Uživatel klikne na uložit. 5. Aplikace registruje změnu a uloží ji. • Následné podmínky: Systém uloží provedené změny. • Alternativní tok: Uživatel se může vrátit zpátky beze změn. • Chybový tok: Nechá-li uživatel název některé z hlaviček prázdné, změna se neuloží a vyskočí varovné MS Windows okno. 71
2. Návrh konverze Umístění výstupního souboru • Vstupní podmínky: Uživatel chce změnit defaultní nastavení umístění výstupního souboru. • Tok událostí: 1. Uživatel klikne na tlačítko nastavení umístění souboru. 2. Aplikace nabídne uživateli MS Windows okno, kde si zvolí umístění souboru . 3. Uživatel klikne na uložit. 4. Aplikace registruje změnu a uloží ji. • Následné podmínky: Systém uloží provedené změny. • Alternativní tok: Uživatel se může vrátit zpátky beze změn. • Chybový tok: Nechá-li uživatel umístění výstupního souboru prázdné, změna se neuloží a vyskočí varovné MS Windows okno. Spuštění převodníku • Vstupní podmínky: Uživatel chce překonvertovat externí reprezentaci vstupního textového dokumentu do LaTeX formátu. • Tok událostí: 1. Uživatel klikne na tlačítko: Spustit převod. 2. Aplikace uskuteční převod. 3. Aplikace uloží výsledný soubor v LaTeX formátu (případ užití Vytvoření převedeného souboru). 4. Aplikace zpracuje průběh konverze a uloží ho do logu. 5. Aplikace zobrazí MS Windows okénko oznamujicí uživateli, že byl převod dokončen. 6. Uživatel potvrdí okénko. • Následné podmínky: – Uživatel může nahlédnout do logu (případ užití - Otevření logu). – Uživatel může použít vytvořený výstupní soubor. • Chybový tok: Přenos se nezdaří. Aplikace zobrazí MS Windows okénko oznamuj9cí uživateli, že se převod nepovedl. Důvod chyby zapíše aplikace do logu. 72
2.2. Návrh chování aplikace Vytvoření převedeného souboru • Vstupní podmínky: Aplikace uloží vytvořený soubor v LaTeX formátu. • Tok událostí: 1. Aplikace úspěšně dokončí převod. 2. Aplikace zjistí umístění výstupního souboru. 3. Aplikace na dané místo uloží soubor v LaTeX formátu. • Následné podmínky: Uživatel může použít vytvořený výstupní soubor. • Chybový tok: Uložení se nezdaří. Aplikace zobrazí MS Windows okénko oznamujicí uživateli, že se uložení nepovedlo. Důvod chyby zapíše aplikace do logu. Výsledné informace o průběhu • Vstupní podmínky: Aplikace skončila převod, ať už úspěšně, nebo neúspěšně. • Tok událostí: 1. Aplikace veškerý průběh převod zaznamená do logu. Na tuto skutečnost uživatele upozorní. 2. Aplikace na dané místo uloží soubor v LaTeX formátu. • Následné podmínky: Uživatel může použít vytvořený výstupní soubor. • Chybový tok: Uložení se nezdaří. Aplikace zobrazí MS Windows okénko oznamujicí uživateli, že se uložení nepovedlo. Důvod chyby zapíše aplikace do logu. Otevření logu • Vstupní podmínky: Aplikace skončila převod, ať už úspěšně, nebo neúspěšně a uživatel otevřel log. • Tok událostí: Výstupní log je uložen jako soubor, práci se souborem zajišťuje operační systém (v tomto případě MS Windows) a není tedy součástí aplikace. Otevření převodní tabulky • Vstupní podmínky: Uživatel si chce prohlídnout konvertní znaky v převodní tabulce. • Tok událostí: Převodní tabulka je koncipována jako soubor, práci se souborem zajišťuje operační systém (v tomto případě MS Windows) a není tedy součástí programu. 73
2. Návrh konverze Editace převodní tabulky • Vstupní podmínky: Uživatel chce změnit konvertní znaky v převodní tabulce. • Tok událostí: Převodní tabulka je koncipována jako soubor, práci se souborem zajišťuje operační systém (v tomto případě MS Windows) a není tedy součástí programu. • Následné podmínky: Aplikace si z převodní tabulky obstarává konverzní znaky. Změna tohoto souboru má vliv na konverzi. • Chybový tok: Je-li soubor používán, nelze změnit jeho obsah.
2.2.2
Diagram stavového stroje
Diagram stavového stroje, neboli State machine diagram, znázorňuje stavy určitého objektu a přechody mezi nimi. Stavový stroj se dá znázornit jako graf stavů a přechodů mezi těmito stavy. Popisuje reakci instance na obdržení události. Popsání jednotlivých prvků diagramů stavového stroje: • Stav, neboli state, je situace, kdy modelovaný objekt naplňuje určitou podmínku, provádí nějakou operaci, nebo čeká na událost. • Přechod, neboli transition, je spojení mezi dvěma stavy. Za splnění určitých podmínek přejde objekt z jednoho stavu do druhého. • Smyčka, která přesunuje přechod do téhož stavu. Něco významného se stane, ale stav se nezmění. • Počáteční a finální stav jsou zvláštní pseudostavy pro počátek a konec automatu. Konkrétní State machine diagram pro tuto aplikaci je navržen na diagramu 2.15. Popisy stavů Zobrazení vstupního okna • Popis stavu: aplikace začíná zobrazením vstupního okna s nabídkou spuštění, či nastavení. • Vstup do stavu: do tohoto stavu se přejde z počátečního stavu, nebo ze stavu nastavení (návrat). • Výstup ze stavu: z tohoto stavu se dá přejít do stavu nastavení, nebo do stavu spuštění převodníku, záleží na tom, co si uživatel vybere. 74
2.2. Návrh chování aplikace
Obrázek 2.15: State machine diagram
75
2. Návrh konverze Nastavení aplikace • Popis stavu: v tomto stavu se provádí veškeré nastavení aplikace. • Vstup do stavu: do tohoto stavu se přejde ze stavu "Vstupní okno". • Výstup ze stavu: z tohoto stavu se dá pouze vrátit do stavu Zobrazení vstupního okna. Spuštění převodníku • Popis stavu: v tomto stavu se pouští nejdůležitější část aplikace. Jedná se o převodník převádějící datové struktury MS WORDu na LaTeXové příkazy. Zde je vyzobrazen jako jeden stav. Skládá se však z více stavů a je znázorněn jako samostatný State machine diagram. • Vstup do stavu: do tohoto stavu se přejde ze "Vstupního okna" kliknutím na tlačítko "Spustit převod". • Výstup ze stavu: po skončení převodu následuje stav "Vytvoření souboru". Vytvoření souboru • Popis stavu: v tomto stavu již hotový převod uloží do souboru. • Vstup do stavu: do tohoto stavu se vstoupí po dokončení převodu. • Výstup ze stavu: po vytvoření souboru (nebo po neúspěšném vytvoření souboru) následuje stav "Oznámení o ukončení"+ zápis do logu. Oznámení o ukončení + zápis do logu • Popis stavu: v tomto stavu se uživateli ve MS Windows okně oznámí výsledek převodu. Oznamí se mu také místo, kde je výsledný soubor uložen a možnost přečíst si log. Do souboru log aplikace uloží veškeré informace o převodu. • Vstup do stavu: po vytvoření souboru (nebo po neúspěšném vytvoření souboru). • Výstup ze stavu: "Konec aplikace".
2.2.3
Diagram stavového stroje - spuštění převodníku
V tomto diagramu je znázorněn stav Spuštění převodníku ve vlastním diagramu stavového stroje 2.16. 76
2.2. Návrh chování aplikace
Obrázek 2.16: Diagram stavového stroje - Spuštění převodníku
77
2. Návrh konverze Popisy stavů Všechny chyby vzniklé v těchto stavech ukončí předčasně převodník, upozorní o tom uživatele a příčinu zapíše do logu. Vytvoření tabulky • Popis stavu: v externím souboru je uložená převodní hashovací tabulka se dvěma sloupci. V levém sloupci se nachází symboly v UNICODE, v pravém slopuci se nachází znaky tak, jak daný znak zobrazuje LaTeX, čili v UTF-8. V tomto stavu se načte tento externí soubor a převede se do datové struktury hashovací pole. Toto hashovací pole používá aplikace jako převodní tabulku znaků. • Vstup do stavu: do tohoto stavu se přejde z počátečního stavu. • Výstup ze stavu: po úspěšném načtení tabulky se přejde do stavu "Načtení konfiguračního souboru". Načtení konfiguračního souboru • Popis stavu: v externím souboru je uložené uživatelské nastavení aplikace. Z tohoto souboru si aplikace zjistí uživatelské nastavení. V případě, že soubor neexistuje, nebo je prázdný, použijí se defaultní hodnoty. • Vstup do stavu: do tohoto stavu se přejde po úspěšném načtení tabulky. • Výstup ze stavu: po úspěšném nastavení uživatelského nastavení přejde aplikace do stavu "Získání obrázků". Získání obrázků • Popis stavu: v tomto stavu aplikace pracuje z obrázky, jež byli ve vstupním souboru použity. Možností, jak získat ze vstupního souboru obrázky, je několik. • Vstup do stavu: do tohoto stavu se aplikace dostane po úspěšném provedení uživatelského nastavení . • Výstup ze stavu: po skončení převodu následuje stav Vytvoření souboru. Vytvoření obsahu • Popis stavu: Nejdůležitější stav celého převodníku. Pomocí pravidel a převodní tabulky se fragmenty vstupního souboru převádějí na soubor výstupní. Tento samotný stav je znázorněn konečným automatem . Tomuto stavu je věnována celá kapitola s názvem "Zpracování obsahu". 78
2.3. Návrh uživatelského rozhraní • Vstup do stavu: tento stav následuje po detekci obrázku a práci s nimi. • Výstup ze stavu: po zpracování obsahu následuje stav "Vytvoření hlavičky". Vytvoření hlavičky • Popis stavu: Vytvořením hlavičky je myšleno definice dokumentu. Vytváření definice následuje až po vytvoření obsahu a to z toho důvodu, že během převodu může vzniknout potřeba vytvoření nových definicí a přidání nových balíčků. Např. při změně barvy se nejdříve musí barva na začátku dokumentu nadefinovat. Ačkoliv se hlavička vytvoří později než obsah dokumentu, bude vložena na začátek výstupního souboru. Díky tomuto způsobu se ušetří jeden průchod textem. • Vstup do stavu: tento stav následuje po převedení celého dokumentu. • Výstup ze stavu: Konec aplikace.
2.3
Návrh uživatelského rozhraní
Uživatelské rozhraní je souhrn způsobů, jakými lidé (uživatelé) ovlivňují chování strojů, zařízení, počítačových programů či komplexních systémů a je jedním z důležitých prvů aplikací a systémů. Jelikož aplikace, či systém, může být sebevíc dokonalá a sebevíc užitečná, pokud není uživatelsky příjemná, nikdo jí nebude používat. Návrhem uživatelského rozhraní je tedy snaha, uživateli co nejvíce zpříjemnit práci s aplikací.
2.3.1
Nielsenova heuristická analýza
K návrhu použijeme Nielsenovu heuristickou analýzu [6], nebo tzv. Nielsenovo desatero, jehož splnění by mělo být každé uživatelsky příjemné prostředí. Nielsenovo desatero se skládá z těchto desíti pravidel: 1. Viditelnost stavu systému. 2. Shoda mezi systémem a realitou. 3. Minimální zodpovědnost (a stres). 4. Shoda s použitou platformou a obecnými standardy. 5. Prevence chyb. 6. Kouknu a vidím. 7. Flexibilita a efektivita. 79
2. Návrh konverze 8. Minimalita (klapky na oči). 9. Smysluplné chybové hlášky. 10. Help a dokumentace. Popis pravidel a jejich použití v aplikaci Viditelnost stavu systému. Systém, v tomto případě aplikace, nesmí zůstat zamrzlá a nereagovat na uživatelské vstupy. Uživatel musí být neustále informován o tom, co aplikace provádí. Aby bylo toto pravidlo splněno, je v návrhu vzhledu spodní informační řádek. Shoda mezi systémem a realitou. Toto pravidlo říká, že by se měly zachovat konvence reálného světa. Tzn., že ikony se musí chovat jako to, co zobrazují a na co odkazují. Minimální zodpovědnost (a stres). Uživatel nemůže nic pokazit. Vždy je možnost vrátit se zpět do předchozího stavu. V aplikaci je toto použito v tom smyslu, že se vstupní soubor nesmaže, uživatel tudíž nic neriskuje. Je však bohužel místo, kde se toto pravidlo porušuje, a to je převodní tabulka, kam má uživatel přístup a kde si může cokoliv smazat či upravit. Bohužel v tomto případě to ošetřit nelze. Shoda s použitou platformou a obecnými standardy. Toto pravidlo vyžaduje, aby program pod Windows vypadal a choval se jako pod tímto operačním systémem. Pokud to jde, měla by aplikace použít standartní systémové komponenty, systémové barvy a fonty. To je v této aplikace splněno již od počátku, jelikož se aplikace vytváří v prostředí VBA, které má všechny komponenty odvozené od MS Windows. Prevence chyb. Uživatel by neměl mít možnost zadat špatnou hodnotu. Toto pravidlo je použito např. při výběru lokace výstupního souboru. Uživatel může zadat pouze soubor, nic jiného. Kouknu a vidím. Aplikace by neměla zatěžovat uživatelovu paměť. Akce, které uživatel může momentálně provést, by měly být viditelné a snadno dosažitelné, stejně tak i informace. Nepotřebné kontrolky naopak být vidět nemusí. Aby bylo toto pravidlo splněno, je aplikace rozdělena do složek "Spuštění", "Nastavení převodu", "Správa znaků", "Správa příkazů". Uživatel vždy vidí pouze tu část prvků, jsou v dané části aktuální. 80
2.3. Návrh uživatelského rozhraní Flexibilita a efektivita. Podle tohoto pravidla by měla aplikace mít dvě verze, pro běžného a zkušeného uživatele. Toto by se dalo řešit pomocí pokročilého módu. Zde to je však zbytečné, jelikož se předpokládá, že aplikaci bude používat zkušený uživatel. Minimalita (klapky na oči). Aplikace by měla zobrazovat pouze informace, které aktuálně k něčemu opravdu jsou. Čím méně jich totiž uživatel má, tím rychleji koná. Grafika by neměla zastiňovat ovládání a účel. Z tohoto důvodu je vzhled navržen velmi stroze a v daném stavu aplikace se zobrazují pouze nezbytné informace. Smysluplné chybové hlášky. Chybové hlášení by mělo být v bežném jazyce - žádné kódy, nebo zkratky. Chybové hlášení by mělo popsat co se stalo špatně, jak se to stalo a jak tomu příště předejít, případná možná řešení doporučit. Doporučení by mělo poučit (vzdělat) uživatele. Toto pravidlo splňuje log v textovém souboru a vyskakovací okna, která na tuto skutečnost poukazují. Help a dokumentace. Systém by měl být použitelný bez jakékoliv nápovědy, nicméně nápověda musí být. Měla by podporovat funkční vyhledávání. Spíše než popisem by se měla zabývat příklady. Toto je v aplikace řešeno manuálem a tlačítkem "Nápověda", které zobrazí nápovědu k danému stavu.
2.3.2
Návrh vzhledu.
• Návrh vzhledu spuštění 2.17 • Návrh vzhledu nastavení převodu 2.18 • Návrh vzhledu správy znaků 2.19 • Návrh vzhledu správy příkazů 2.20
81
2. Návrh konverze
Obrázek 2.17: Návrh vzhledu - spuštění
Obrázek 2.18: Návrh vzhledu - nastavení převodu
82
2.3. Návrh uživatelského rozhraní
Obrázek 2.19: Návrh vzhledu - správa znaků
Obrázek 2.20: Návrh vzhledu - správa příkazů
83
KAPITOLA
Realizace V této kapitole popíšeme realizaci úkolů, jež se řídí návrhem a analýzou popsanou v předchozích kapitolách. Členění kapitoly zůstane stejné, jako je tomu u zadání úkolu. Díky tomu budeme moci v závěru porovnat, zda jsme všechno splnili.Postup realizace bude probíhat přesně, jak jsme si stanovili v návrhu. Při realizaci však vzniklo plno problémů, s kterými se při návrhnu nepočítalo.
3.1
Realizace převodu
Realizace proběhla podle návrhu. Objevily se zde však drobné problémy, jež můžou narušit sémantiku LATEXu.
3.1.1
Prolínání více příkazů
Atributy textu Zde nastal problém v případě, že uživatel použil na text dva různé typy a to tak, že jeden typ začal v již započatém druhém typu. Potom první typ skončil a druhý typ měl pokračovat dál. Takto navržený algoritmus však udělal to, že ukončil typ druhý. Např. text testování, kde se prolínají dva typy, by převodník podle návrhu vypsal text testování, což je rozdíl. Pro tuto chybu existuje řešení takové, že algoritmus pokaždé, když bude vytvářet nějaký atribut písma, všechny již otevřené atributy ukončí. Při dalším znaku se všechny atributy, jež mají být otevřené, opět otevřou. Testovací text by měl ve výstupním souboru tuto podobu: t\underline{es\textbf{to}}\textbf{vá}ní. V této podobně již LATEXvykreslí text tak, jak se očekává. Toto řešení funguje mezi prolínáním příkazů pro změnu veškerých atributů (čili pro změnu barvy písma, zvýraznění písma, velikosti písma, tučného písma, podtrženého písma a písma typu Italic). 85
3
3. Realizace Formátování textu Zde nastal problém při vnořování příkazů LATEXu, jestliže byl otevřený nějaký příkaz upravující atribut (čili změnu barvy písma, zvýraznění písma, velikosti písma, tučného písma, podtrženého písma a písma typu Italic) a vznikl požadavek na vytvoření příkazu pro formátování textu. Kdyby jsme příkaz pro upravující atribut nechali otevřený, nebyla by dodržena syntaxe LATEXu a LATEX by odmítl tuto formulaci vysázet. Proto, kdykoliv se otevírá jakýkoliv příkaz pro formátování textu (ať už se jedná o zarovnání, nebo výčet), musí se příkaz pro upravující atribut zavřít. Jestliže změna atributu po otevření formátovacího textu bude nadále pokračovat, opět se příkaz k otevření změny atributu otevře. Stejně musíme postupovat i pokud budeme formátovací příkaz uzavírat. Čili, jakmile se zavře formátovací příkaz, musí se zavřít i příkaz pro změnu atributu. Pokud po uzavření formátovacího příkazu bude změna atributu nadále pokračovat, opět se příkaz k otevření změny atributu otevře.
Nadpisy Je-li použit příkaz Nadpis, musí se ukončit veškeré příkazy, jež určují změnu atributů, příkazy, jež určují formátování textu, tabulky a odkazy. Jakmile je příkaz nadpis použit, nesmí se po celou dobu, co je otevřený, otevřít příkaz pro formátování textu, příkaz pro další nadpis, příkaz pro vytvoření tabulky, nebo příkaz pro vytvoření odkazu. Zakázané příkazy, jež se budou chtít nechat otevřít, budou ignorovány. Jediné příkazy, které se mohou během otevřeného nadpisu použít, jsou příkazy pro změnu atributu. Po zakončení nadpisu se již opět mohou používat všechny příkazy. Byly-li nějaké příkazy pro změnu atributu otevřeny během otevřeného nadpisu, budou po ukončení nadpisu také ukončeny.
Tabulka Je-li použit příkaz Tabulka, musí se ukončit veškeré příkazy, jež určují změnu atributů, příkazy, jež určují formátování textu (s výjimkou příkazu pro nový řádek), nadpisy a odkazy. Jakmile je příkaz tabulka použit, nesmí se po celou dobu, co je otevřený, otevřít příkaz pro formátování textu (kromě příkazu nového řádku), příkaz pro nadpis, příkaz pro vytvoření další tabulky, nebo příkaz pro vytvoření odkazu. Zakázané příkazy, jež se budou chtít nechat otevřít, budou ignorovány. Jediné příkazy, které se mohou během otevřeného nadpisu použít, jsou příkazy pro změnu atributu a příkaz pro vytvoření nového řádku, jež signalizuje nový řádek tabulky. Po zakončení nadpisu se již mohou opět používat všechny příkazy. Byly-li nějaké příkazy pro změnu atributu otevřeny během otevřeného nadpisu, budou po ukončení nadpisu také ukončeny. 86
3.1. Realizace převodu Odkazy Při otevírání příkazu odkazu, jsou všechny ostatní příkazy uzavřeny. Po dobu otevření příkazu odkaz jsou veškeré jiné požadavky na příkaz ignorovány. Jakmile je příkaz odkaz ukončen, všechny ostatní příkazy jsou povoleny. Grafický objekt Při otevírání příkazu grafického objektu, jsou všechny ostatní příkazy uzavřeny. Po dobu otevření příkazu odkaz jsou veškeré jiné požadavky na příkaz ignorovány. Jakmile je příkaz odkaz ukončen, všechny ostatní příkazy jsou povoleny.
3.1.2
Parametrická tabulka
Jelikož pravidel, kdy má být jaký příkaz uzavřen a kdy zakázán, je mnoho, vytvořili jsme parametrickou tabulku 3.2 a 3.1, v které jsou veškeré tyto zákazy a příkazy k uzavření popsány tak, aby s nimi mohla aplikace jednotným způsobem pracovat. Tabulka je navržena tak, aby v ní mohl programátor jakýkoliv příkaz, nebo zákaz přidat, nebo ubrat bez toho, aniž by musel dělat rozsáhlé změny ve zdrojovém kódu. Zároveň tabulka obsahuje LATEXové příkazy pro otevření a zavření příkazu, s kterými program pracuje. Je-li třeba některý příkaz otevření nebo příkaz zavření potřeba změnit, může se to udělat v této tabulce bez rozsáhlé změny ve zdrojovém kódě programu. Parametrická tabulka je uložena v souboru cTable.txt. Každý řádek určuje jeden příkaz. Formát dat je následující: Zkratka příkazu|Otevření příkazu|Zavření příkazu|Uzavírané příkazy|Zakázané příkazy. • Zkratka příkazu - je zkratka pro příkaz otevření tučného textu. Zkratky slouží jako identifikátor. Např.: bude-li pak mít některý příkaz ve sloupci s názvem "zakázané příkazy"písmeno X, bude vědět, že je příkaz, jehož identifikátor je X, zakázán. • Otevření příkazu - příkaz kterým se v LATEXu otevře daný příkaz. • Zavření příkazu - příkaz kterým se v LATEXu zavře daný příkaz. • Uzavírané příkazy - Příkazy, jež se mají při otevření tohoto příkazu uzavřít. • Zakázané příkazy - Příkazy, jež po dobu otevření tohoto příkazu nesmějí být otevřeny. • | - je oddělovač. Slouží pro program, aby mohl rozpoznat jednotlivé části. Díky tomuto symbolu si může části rozparsovat do pole a pracovat s nimi. 87
3. Realizace Příklad: Příkaz pro tučný text je definován takto: B|\textbf{ |}|U,I,C,Bc|0. • B - zkratka pro příkaz tučný text je B. Vznikla od anglického slova bold. • U - zkratka pro podtržený text (underline). Jelikož je U ve sloupci uzavírané příkazy, znamená to, že po spuštění příkazu B (tučný text) musí být uzavřen. • I - zkratka pro text typu Italic. Jelikož je I ve sloupci uzavírané příkazy, znamená to, že po spuštění příkazu B (tučný text), musí být uzavřen. • C - zkratka pro barvu písma (color). Jelikož je C ve sloupci uzavírané příkazy, znamená to, že po spuštění příkazu B (tučný text), musí být uzavřen. • Bc - zkratka pro barvu pozadí písma (background color). Jelikož je Bc ve sloupci uzavírané příkazy, znamená to, že po spuštění příkazu B (tučný text), musí být uzavřen. • 0 ve sloupci pro zakázané příkazy symbolizuje, že žádné příkazy nejsou v průběhu otevřeného příkazu B zakázány. Parametr v otevřeném příkazu Může nastat situace, kdy do parametrické tabulky chceme připsat nový příkaz, jenž má parametr, jehož hodnota je známa až v běhu programu. Upravili jsme tedy program tak, že název proměnné, která nám za běhu programu hodnotu dodá, můžeme dát mezi dva znaky zavináče. Příklad.: Otevření příkazu pro změnu atributu barvy je \textcolor{čísloNadefinovanéBarvy}{. Číslo nadefinované barvy se však dozvíme až v době puštění programu. Přidáme tedy do tohoto příkazu proměnou ohraničenou dvěma zavináči, v které nám program v době překladu pošle potřebnou hodnotu. Výsledný příkaz tedy bude \textcolor{@color@}{. Zavináče slouží pouze jako oddělovače od příkazu. Díky tomu, program bude vědět, že se jedná o proměnou, jejichž hodnotu tam má dosadit. U přidání příkazu tímto způsobem, je už potřeba drobný zásah do zdrojového kódu. Všechny příkazy se tak daly vytvořit formou parametrické tabulky 3.2 a 3.1. Kromě příkazů grafický objekt, tabulka a odkaz, jež musely být řešeny individuálně.
3.1.3
Tabulka barev
Pří vytváření zpracování příkazu pro tvorbu barevného pozadí nastal problém. Zjistili jsme, že metoda Char.HighlightColorIndex nevrací barvu pozadí textu, ale pouze index od 0 do 16, jenž udavá řádek tabulky barev, kterou má k dispozici pouze MS Word. My jsme si však RGB hodnoty těchto barev pro 88
3.1. Realizace převodu
Tabulka 3.1: Parametrická tabulka 2 Název příkazu Nadpis úroveň 1
Zkratka příkazu H1
Otevření příkazu \section{
Zavření příkazu }
Nadpis úroveň 2
H2
\subsection{
}
Nadpis úroveň 3
H3
\subsubsection{
}
Nadpis úroveň 4
H4
\paragraph{
}
Nadpis úroveň 5
H5
\subparagraph{
}
Výčet úroveň 1
L1
\begin{@type@}\item
\end{@type@}
Výčet úroveň 2
L2
\begin{@type@}\item
\end{@type@}
Výčet úroveň 3
L3
\begin{@type@}\item
\end{@type@}
Výčet úroveň 4
L4
\begin{@type@}\item
\end{@type@}
Uzavírané příkazy H2,H3,H4,H5 Al,Ac,Ar,I, B,U,C,Bc H1,H3,H4,H5 Al,Ac,Ar,I, B,U,C,Bc H1,H2,H4,H5 Al,Ac,Ar,I, B,U,C,Bc H1,H2,H3,H5 Al,Ac,Ar,I, B,U,C,Bc H1,H2,H3,H4 Al,Ac,Ar,I, B,U,C,Bc H1,H2,H3,H4, H5,Al,Ac,Ar, I,B,U,L2, L3,L4,C,Bc H1,H2,H3,H4, H5,Al,Ac,Ar, I,B,U,L3, L4,C,Bc H1,H2,H3,H4, H5,Al,Ac,Ar, I,B,U,L4,C,Bc H1,H2,H3,H4, H5,Al,Ac,Ar, I,B,U,C,Bc
89
Zakázané příkazy Al,Ar,Ac,L1, L2,L3,L4 Al,Ar,Ac,L1, L2,L3,L4 Al,Ar,Ac,L1, L2,L3,L4 Al,Ar,Ac,L1, L2,L3,L4 Al,Ar,Ac,L1, L2,L3,L4 Al,Ar,Ac,H1, H2,H3,H4,H5
Al,Ar,Ac,H1, H2,H3,H4,H5 Al,Ar,Ac,H1, H2,H3,H4,H5 Al,Ar,Ac,H1, H2,H3,H4,H5
3. Realizace Tabulka 3.2: Parametrická tabulka 1 Název příkazu tučný text Italic text podtržený text barva text barva pozadí Zarovnání textu vlevo Zarovnání textu vpravo Zarovnání textu na střed
Zkratka příkazu B
Otevření příkazu \textbf{
Zavření příkazu }
Uzavírané příkazy I,B,C,Bc
I
\textit{
}
U,B,C,Bc
U
\underline{
}
I,B,C,Bc
C
\textcolor{@color@}{
}
I,B,U,C,Bc
Bc
\boxcolor{@color@}{
}
I,B,U,C
Al
\begin{flushleft}
end{flushleft}
Ac,Ar,I,B, U,C,Bc
Ar
\begin{flushright}
end{flushright}
Ac,Al,I„B U,C,Bc
Ac
\begin{center}
end{center}
Ar,Al,I,B, U,C,Bc
daný index zjistili a udělali si vlastní tabulku, jež program při spuštění načte a jež používá pro převod indexu na konkrétní barvu v RGB formě. Tabulka je uložena v souboru hTable.txt. Uspořádání tabulky v textovém souboru je takové, že co řádek souboru, to řádek tabulky. Sloupce jsou rozlišeny znakem |.
3.1.4
Převod barvy
Další problém nastal, při používaní barev. MS Word totiž vrací hodnoty barev ve 4 bytech ve formátu 00BBGGRR. LATEX však potřebuje mít barvy ve formátu R,G,B, kde každá barevná složka je vyjádřena v rozmezí od 0.0 - 1.0. Problém jsme vyřešili následně. 1. Červenou složku jsme vypreparovali tak, že jsme 4 bajty logicky vynásobili maskou HFF. Po logickém vynásobení nám zbyla pouze červená složka, kterou jsme vydělili číslem 255, aby jsme měli podíl červené složky vyjádřené v rozmezí 0.0-1.0. 2. Zelenou složku jsme vypreparovali tak, že jsme 4 bajty logicky vynásobili maskou HFF00. Po logickém vynásobení jsme výsledek vydělili číslem 90
Zakázané příkazy
3.2. Realizace vzhledu aplikace 256. Po této operaci nám zbyla pouze zelená složka, kterou jsme vydělili číslem číslem 255, aby jsme měli podíl zelené složky vyjádřené v rozmezí 0.0 - 1.0. 3. Modrou složku jsme vypreparovali tak, že jsme 4 bajty logicky vynásobili maskou HFF0000. Po logickém vynásobení jsme výsledek vydělili číslem 65536. Po této operaci nám zbyla pouze modrá složka, kterou jsme vydělili číslem číslem 255, aby jsme měli podíl modré složky vyjádřené v rozmezí 0.0 - 1.0.
3.1.5
Export grafických objektů
V návrhu byla vybrána metoda: "Uložení stránky jako HTML". Tato metoda je ze všech tří nejefektivnější. Spočívá v těchto krocích. 1. Foreach průchod pro všechny grafické objekty. 2. Pro každý item ve foreach průchodu se uloží jeho pořadí a název (pro budoucí identifikaci). 3. Uložení dokumentu jako html souboru pomocí metody SaveAs FileName. 4. Nalezení obrázku ve vytvořeném adresáři. 5. Použití obrázku ve výstupním souboru + identifikace pomocí datové struktury z bodu 2. 6. Smazání přebytečných souborů vytvořených uložením jako html. 7. Uložení dokumentu do původní formy.
3.2
Realizace vzhledu aplikace
Realizace vzhledu proběhla přesně podle návrhu. • Realizace vzhledu spuštění 3.1 • Realizace vzhledu nastavení převodu 3.2 • Realizace vzhledu správy znaků 3.3 • Realizace vzhledu správy příkazů 3.4
91
3. Realizace
Obrázek 3.1: Realizace vzhledu - spuštění
Obrázek 3.2: Realizace vzhledu - nastavení převodu
92
3.2. Realizace vzhledu aplikace
Obrázek 3.3: Realizace vzhledu - správa znaků
Obrázek 3.4: Realizace vzhledu - správa příkazů
93
KAPITOLA
Testování Testování bylo provedeno na několika testovacích scénářích. Na každý úkol ze zadání je jeden scénář. U každého testu je zadání a tři obrázky. První obrázek znázorňuje zobrazení dokumentu před konverzí ve v MS Word. Druhý obrázek znázorňuje zdrojový kód výstupního souboru. Třetí obrázek znázorňuje zobrazení dokumentu po konverzi v LATEX formátu.
4.1
Testování atributů a jejich vzájemných prolínání
1. Zobrazení dokumentu před konverzí ve v MS Word - obr. 4.1. 2. Zdrojový kód výstupního souboru - obr. 4.2. 3. Zobrazení dokumentu po konverzi v LATEX formátu - obr. 4.3.
Obrázek 4.1: Zobrazení dokumentu před konverzí ve v MS Word 95
4
4. Testování
Obrázek 4.2: Zdrojový kód výstupního souboru
Obrázek 4.3: Zobrazení dokumentu po konverzi v LATEX formátu
96
4.2. Testování formátování a jejich vzájemných prolínání
Obrázek 4.4: Zobrazení dokumentu před konverzí ve v MS Word
4.2
Testování formátování a jejich vzájemných prolínání
1. Zobrazení dokumentu před konverzí ve v MS Word - obr. 4.4. 2. Zdrojový kód výstupního souboru - obr. 4.5. 3. Zobrazení dokumentu po konverzi v LATEX formátu - obr. 4.6.
4.3
Testování tabulek a jejich odkazů
1. Zobrazení dokumentu před konverzí ve v MS Word - obr. 4.7. 2. Zdrojový kód výstupního souboru - obr. 4.8. 3. Zobrazení dokumentu po konverzi v LATEX formátu - obr. 4.9.
4.4
Testování obrázků a jejich odkazů
1. Zobrazení dokumentu před konverzí ve v MS Word - obr. 4.10. 2. Zdrojový kód výstupního souboru - obr. 4.11. 3. Zobrazení dokumentu po konverzi v LATEX formátu - obr. 4.12. 97
4. Testování
Obrázek 4.5: Zdrojový kód výstupního souboru
Obrázek 4.6: Zobrazení dokumentu po konverzi v LATEX formátu
98
4.4. Testování obrázků a jejich odkazů
Obrázek 4.7: Zobrazení dokumentu před konverzí ve v MS Word
Obrázek 4.8: Zdrojový kód výstupního souboru
Obrázek 4.9: Zobrazení dokumentu po konverzi v LATEX formátu
99
4. Testování
Obrázek 4.10: Zobrazení dokumentu před konverzí ve v MS Word
Obrázek 4.11: Zdrojový kód výstupního souboru
100
4.5. Testování nadpisů
Obrázek 4.12: Zobrazení dokumentu po konverzi v LATEX formátu
4.5
Testování nadpisů
1. Zobrazení dokumentu před konverzí ve v MS Word - obr. 4.13. 2. Zdrojový kód výstupního souboru - obr. 4.14. 3. Zobrazení dokumentu po konverzi v LATEX formátu - obr. 4.15.
4.6
Testování rovnic
1. Zobrazení dokumentu před konverzí ve v MS Word - obr. 4.16. 2. Zdrojový kód výstupního souboru - obr. 4.17. 3. Zobrazení dokumentu po konverzi v LATEX formátu - obr. 4.18.
101
4. Testování
Obrázek 4.13: Zobrazení dokumentu před konverzí ve v MS Word
Obrázek 4.14: Zdrojový kód výstupního souboru
102
4.6. Testování rovnic
Obrázek 4.15: Zobrazení dokumentu po konverzi v LATEX formátu
103
4. Testování Obrázek 4.16: Zobrazení dokumentu před konverzí ve v MS Word
104
4.6. Testování rovnic
Obrázek 4.17: Zdrojový kód výstupního souboru
105
4. Testování
Obrázek 4.18: Zobrazení dokumentu po konverzi v LATEX formátu
106
Závěr V rámci této práce jsme analyzovali a zdokumentovali použité datové struktury objektového modelu MS Word a korespondující syntaxi formátu LATEX. Vyřešili jsme konverzi vnitřní reprezentaci vstupního textového dokumentu na výstupní formát v LATEXu. Konvertor převadí následující vlastnosti. • Znaková sada - pomocí externích převodních tabulek jsme realizovali převodník z Unicode kódování do sekvence znaků LATEXu. • Styl a nadpis textu - naše konverze zahrnuje i rozpoznání nadpisů a stylů v textu a jejich úspěšný převod do LATEX formátu. • Formátování textu - v této práci jsme realizovali konverzi zarovnání a výčtové prostředí textu. • Atributy textu - realizovali jsme konverzi 6-ti atributů textu a i jejich vzájemné vnořování. • Tabulky - tato práce obsahuje i převod jednoduchých tabulek a jejich odkazů na ně. • Vložené objekty - vložené objekty jsme vyřešili konverzí na obrázky. • Odkazy - součástí realizace je i konverze veškerých odkazů. – Poznámka pod čarou – Titulek (caption) – Křížový odkaz – Odkaz na web • Rovnice – Zlomky – Indexy – Odmocniny – Integrály 107
Závěr – Velký operátory – Závorky – Funkce – Limita a logaritmy – Operátory – Matice Vzhledem k tomu, že LATEX nepodporuje stejnou granularitu jako Microsoft Office Word, vyřešili jsme tento rozpor pomocí parametrické tabulky. Nepodporované vnoření formátovaných konstrukcí je detekováno, označováno a zapisováno do logu. Tabulka 4.1 ukazuje splnění cílů a jejich pokrytí jednotlivými kapitolami. Při realizaci se ukázalo, že co se může zdát v analýze a návrhu jako zřejmé a jednoduché, může nakonec vyústit v řadu problémů. Tyto veškeré problémy, jež jsou detailněji popsané v kapitole Realizace, většinu těchto problémů se nám podařilo vyřešit. Jednalo se například o vnoření více příkazů pro změnu atributů do sebe, nebo vzájemné rušení příkazů, jež syntaxe LATEXu nepodporovala. Existuje mnoho konstrukcí které se dají oproti současnému stavu rozšířit. Například, rovnice se v této verzi převádí jako obrázek, ačkoli by se dala řešit i vhodnějšími způsoby. Dále je tu skutečnost, že současný převodník neumí pracovat se sloučenými buňkami tabulek. Převodník je vhodným nástrojem pro automatizaci převodu, umožňuje výrazné urychlení převodu textů vytvořených a udržovaných v prostředí Microsoft Office Wordu pro publikace vyžadující prostředí LATEX. Práci jsme věnovali pro akademické účely všem studentům Fakulty Informačních Technologií pod jejíž záštitou tato práce mohla vzniknout.
108
Tabulka 4.1: Mapovací tabulka Cíle práce MS Word TeX Konverze Znaková sada Styl textu Formát textu Atributy textu Hierarchie nadpisů Tabulky Vložené objekty Odkazy Rovnice Uživatelské prostředí Testování
Úvod √ √
Analýza √ √ √
Návrh
Realizace
√ √ √ √ √ √ √ √ √ √ √
√ √ √ √ √ √ √ √ √ √ √
Testování
√ √ √ √ √ √ √ √ √ √ √
109
Literatura [1] Beth Melton, K. M., Mary Millhollon: Mistrovství v Microsoft Office Word 2007. Computer Press, 2008. [2] Cadstudio: Visual Basic pro Aplikace - návod. Květen 2012. Dostupné z WWW:
[3] Helmut Kopka, P. W. D.: Latex, Kompletní průvodce. Computer Press, 2004. [4] Král, M.: Excel VBA, Výukový kurz. Computer Press, 2010. [5] Microsoft: Nápověda a postupy k aplikaci Word 2003. Květen 2012. Dostupné z WWW: [6] Nielsen, J.: Nielsen’s Heuristic Evaluation. Květen 2012. Dostupné z WWW: [7] WikiBooks: LATEX, návod. Květen 2012.
Dostupné
z
WWW:
111
PŘÍLOHA
Seznam použitých zkratek Ac Align center Al Align left Ar Align right B Bold Bc Background color C Color H1 Header 1 H2 Header 2 H3 Header 3 H4 Header 4 H5 Header 5 HTML HyperText Markup Language I Italic L1 List 1 L2 List 2 L3 List 3 L4 List 4 113
A
A. Seznam použitých zkratek MS Word Microsoft Office Word U Underline UML Unified Modeling Language URL Uniform Resource Locator UTF-8 UCS Transformation Format VBA Visual Basic for Applications XML eXtensible Markup Language
114
PŘÍLOHA
Obsah přiloženého CD
readme.txt...................................stručný popis obsahu CD src impl...................................zdrojové kódy implementace thesis ...................... zdrojová forma práce ve formátu LATEX text ....................................................... text práce thesis.pdf ............................. text práce ve formátu PDF thesis.ps ................................ text práce ve formátu PS 115
B