LaTeX-satsning som programmeringssprog
LaTeX er et system til satsning af dokumenter, der erstatter begrebet What-You-See-Is-What-You-Get med standardideer fra konventionelle programmeringssprog. Mark Harman demonstrerer styrken af denne arv.
Alle, der har brugt en What-You-See-Is-What-You-Get (WYSIWYG)-editor, tekstbehandler eller DTP-pakke, har sikkert oplevet to frustrationer:
WYSIWYG synes altid at være en løgn Det, man ser, ligner ret meget det, man får, eller det, man ser, er næsten altid det, man får, eller det, man ser, ville være det, man fik, hvis printeren havde haft de rigtige skrifttyper, men det, man ser, er sjældent præcis det, man får.
WYSIWYG er restriktiv Antag, at du ikke kan få lov til at se det, du ønsker? What you see is what you get har den yderligere og stiltiende implikation, at det, du ikke kan nå at se, kan du heller ikke få. Hvor ofte har du ikke ønsket, at noget skulle se lidt anderledes (eller måske meget anderledes) ud, men din editor vil ikke tillade det?
LaTeX (udtales Lateck) er et sættesystem, der ikke følger WYSIWYG-princippet. I stedet er det inspireret af programmeringssprog. Det arver alle fordelene ved programmeringssprog og nogle af deres ulemper. I stedet for at sammensætte et dokument på skærmen (WYSIWYG-tilgangen) er et LaTeX-dokument et program, der fortæller LaTeX-systemet, hvordan dokumentet skal oprettes. Programmet kompileres ved hjælp af en LaTeX-kompiler for at producere et dokument, som kan udskrives eller ses.
Dette kan lyde lidt mærkeligt for nogen, der er bekendt med WYSIWYG-tilgangen, men enhver, der nyder (eller sætter pris på) kraften og fleksibiliteten i et programmeringssprog på højt niveau, vil hurtigt opdage, at LaTeX simpelthen er en bedre måde at designe dokumenter på.
I denne artikel vil jeg forklare lidt om LaTeX-sproget, nok til at du kan downloade et gratis LaTeX-system og skrive nogle normale dokumenter. Der vil ikke være tid til at dække alle LaTeX’s funktioner (det ville tage en hel bog), men jeg håber at efterlade dig med en stærk fornemmelse for måder, hvorpå det at skrive et dokument ved hjælp af LaTeX kunne være en aktivitet, der svarer til at skrive et program.
En simpel LaTeX-kildefil
Figur 1 indeholder en simpel LaTeX-kildefil. Den første linje er en foruddefineret LaTeX-kommando. Alle kommandoer starter med et backslash-tegn. Kommandoen i den første linje fastlægger de globale egenskaber for det dokument, der skal sættes. Dokumentstilen article er den stil, der anvendes til en kort artikel. Andre stilarter omfatter bog, rapport, rapport, afhandling og så videre. Hver dokumentstil ændrer globale parametre, som beskriver layoutet af dit dokument. I bogmiljøet produceres der f.eks. løbende overskrifter, der angiver kapiteltitel og forfatter på skiftende sider.
Som alle gode programmeringssprog er alt dette naturligvis fuldt konfigurerbart. Men som de fleste programmeringssprog gælder det, at jo mere fleksibilitet du ønsker, jo mere skal du vide om det underliggende programmeringssprog. Heldigvis giver standardindstillingerne for alle LaTeX-miljøerne meget behagelige resultater, så det er muligt at komme langt uden at skulle kende alt for meget til det underliggende sprog. Det, du får, vil sandsynligvis være det, du ønsker, og hvis det ikke er det, vil du i det mindste kunne ændre det.
Selve dokumentets tekst er indeholdt i kommandoerne \begin{document} … \end{document}, \begin{} og \end{} er kommandoer, som åbner og lukker et miljø. Alle dokumenter (og fragmenter af dokumenter) sættes inden for et miljø. Vi kan også indlejre miljøer, som vi skal se senere.
Trykstegn er ligegyldige for LaTeX; ét mellemrum er lige så godt som hundrede. Nye linjer kan også indsættes hvor som helst, men to eller flere nye linjer bruges til at markere det punkt, hvor et afsnit slutter og et andet begynder. Når du udskriver det endelige dokument, vil LaTeX venstre- og højrejustere teksten (ved at indsætte bindestreger, hvor ren justificering ville føre til uinteressant output).
Et stort dokument består normalt af en række afsnit, som kan indeholde underafsnit. Et nyt afsnit indføres i LaTeX med kommandoen \section og et nyt underafsnit med kommandoen \subsection. LaTeX-kildekoden i figur 2 beskriver et dokument med to afsnit, hvis titler vil være introduktion og begrundelse. Bemærk, at vi i kildekoden ikke behøver at give afsnittene et afsnitsnummer. LaTeX vil gøre dette for os, når den kompilerer dokumentet. Indledning vil således være afsnit nummer 1 og begrundelse vil være afsnit nummer 2. Hvis vi bytter om på rækkefølgen af de to afsnit (ved at klippe og indsætte kildekoden), vil rationale blive afsnit 1, mens introduktion automatisk vil blive afsnit 2.
Der opstår nu et vigtigt spørgsmål: Hvordan vil jeg krydshenvise fra det ene afsnit til det andet? Lad os f.eks. antage, at jeg vil henvise til afsnittet introduktion i afsnittet rationale. Måden, hvorpå dette opnås, illustrerer den første fordel, vi får ved LaTeX’ måde at gøre tingene på.
Symbolske referencer
Da en LaTeX-kildefil er et program, kan du bruge symbolske navne til at henvise til dele af dokumentet. Dette gør krydshenvisninger til en fornøjelse, da krydshenvisningen er en logisk enhed, der henviser til en navngiven del af dokumentet. Hvis denne navngivne del af dokumentet skal flyttes, er det eneste, vi skal gøre, at omkompilere.
For at indføre en symbolsk reference bruger vi kommandoen \label{}, og for at henvise til den bruger vi kommandoen \ref{}. Figur 3 illustrerer dette. \label{intro} introducerer et symbolsk navn, label, hvis værdi afhænger af den kontekst, hvori \label-kommandoen optræder. I dette tilfælde, da \label-kommandoen anvendes i det første afsnit af dokumentet, vil den værdi, der tildeles intro, være 1. \ref{}-kommandoen producerer blot værdien af etiketten. Hvis jeg nu flytter indledningen til en ny position, f.eks. efter afsnittet rationale, vil værdien af intro ændre sig til 2, og krydsreferencen i rationale vil således pege på den nye placering af afsnittets indledning.
Denne skrivestil tvinger os til at tænke på dokumentet på et logisk niveau snarere end på det fysiske niveau. Det ville være tåbeligt at skrive som vi så tidligere i afsnit \ref{intro} for eksempel, fordi vi måske flytter etiketten intro til et punkt efter henvisningen. I stedet for at tænke på vores dokument som en monolit af tekst, der forekommer i en bestemt rækkefølge, tænker vi på det på et højere abstraktionsniveau, som en samling af afsnit, som vi frit kan flytte rundt på. Vi kan endda genbruge sektioner fra et dokument i et andet, og forudsat at vores symbolske navne er unikke, vil vi opdage, at alle krydsreferencerne fungerer korrekt.
Nogle flere miljøer
LaTeX har masser af nyttige foruddefinerede miljøer. Lad os antage, at vi ønsker at producere en sekvens af punkter ved hjælp af bullets. Det kan vi gøre med itemize-miljøet, kildekoden i figur 4 vil producere et dokument, der opregner de tre vigtigste stoftilstande, én pr. linje og hver med et punktum foran. I mange henseender ligner LaTeX-måden at designe et dokument den måde at gøre tingene på, som man gør det i HTML. F.eks. ligner itemize-miljøet ret meget det usorterede liste-miljø i HTML.
Sommetider ønsker vi at sætte emner ind i en sorteret, nummereret liste. Dette opnås med enumerate-miljøet. Figur 5, viser en indlejret sekvens af enumerate-elementer, der beskriver de fire geologiske tidsaldre og de perioder, der ligger inden for dem. LaTeX anvender forskellige nummereringssystemer for hvert niveau af indlejring (arabiske tal for niveau et, alfabetiske tegn for niveau to, romertal for niveau tre). Dette kan, som med alt andet, ændres, hvis vi ønsker det.
For at fremhæve en del af teksten omsluttes den af em-miljøet (emphasise), så vi skriver simpelthen \begin{em} hjælp! \end{em} hun græd. for at fremhæve ordet hjælp (og det udråbstegn, der følger efter det).
Procedurer
I et konventionelt programmeringssprog giver muligheden for at definere procedurer programmøren en betydelig fleksibilitet. Også i LaTeX kan vi definere procedurer for layout af tekst. Den enkleste form for procedure er en procedure uden parametre. Den giver os mulighed for at navngive en del af kildekoden og derefter kalde den op. Lad os antage, at jeg er ved at skrive et dokument, hvor jeg vil henvise til en frugt, men jeg har endnu ikke besluttet, om det skal være et æble, en appelsin eller en pære. Jeg kunne indføre en procedure kaldet frugt og sætte et vilkårligt frugtnavn i dens krop. Når jeg endelig har besluttet, hvilken frugt jeg vil henvise til, behøver jeg kun at ændre procedurens krop; alle de steder, hvor proceduren kaldes, vil så automatisk tage højde for ændringen af dens krop.
I LaTeX kaldes en procedure for en kommando, og en ny procedure oprettes med kommandoen \newcommand. Kommandoer kaldes ofte makroer, fordi LaTeX udvider kald til disse, når den møder dem i dokumentets brødtekst. Figur 6 illustrerer brugen af en simpel parameterløs makro. Når LaTeX-kilden i denne figur er kompileret, giver den teksten The first apple to appear will be the first apple I shall eat.
For at være helt fair, kunne dette opnås, måske mere enkelt, med en WYSIWYG-ordbehandler, blot ved at foretage en søgning og udskiftning. (Dette ville naturligvis ikke have fungeret, hvis sætningen havde været: “Den første \frugt, der kommer frem, er mit æble!”) Dette er dog kun et simpelt eksempel på, hvad vi kan gøre med LaTeX-makroer. De kommer virkelig til deres ret, når vi forsyner dem med parametre.
Parametre
Sæt, at jeg skriver et dokument om arrayhåndtering. Jeg ønsker måske at beskrive en algoritme til at finde det største element i et array. For at gøre dokumentet mere generisk og for at undgå at skulle skrive store dele af det om, kunne jeg lave to versioner, der hver især er specifikke for et bestemt programmeringssprog, f.eks. Basic og C. Ved hjælp af kommandoer kan jeg undgå at bruge den særlige syntaks for arrays, eller i det mindste kan jeg indfange de syntaktiske forskelle i en enkelt kommando, hvilket gør det meget lettere at tilpasse mit dokument til forskellige programmeringssprog.
Figur 7 illustrerer dette. I kommandodefinitionen for \lookup fortæller den LaTeX-compileren, at kommandoen tager to parametre, den første betegnes som #1 og den anden som #2. I et kald til en kommando angives parametrene efter hinanden i krøllede parenteser. Så opkaldet \lookup{S}{2}, vil producere teksten S(2). Dette er Basic-versionen af kommandoen \lookup. Hvis vi erstatter den med versionen i figur 8, får vi det samme dokument, men med array-referencer i firkantede parenteser. Dette er C-versionen af dokumentet. Bemærk, at forskellen mellem de to LaTeX-kildedokumenter er præcis to tegn, nemlig de to tegn, der udgør forskellen mellem arrayreferencer i Basic og C.
Som med procedurer i programmeringssprog er det muligt at kalde en procedure fra kroppen af en anden og at bruge resultatet af et procedureopkald som den egentlige parameter til en anden. Så vi kan f.eks. skrive \lookup{A}{\lookup{B}{1}}}, som enten producerer teksten A(B(1)) eller A], afhængigt af om vi bruger Basic- eller C-versionen af \lookup-kommandoen.
Variabler
LaTeX har sine egne variabler, som vi kan udføre simpel aritmetik på (mere avancerede former for aritmetik er mulige, men addition er normalt alt, hvad der er nødvendigt for at sætte en tekst). Jeg vil se på to enkle eksempler på den måde, hvorpå vi kan bruge variabler, som begge vil være velkendte for programmører; tæller-variablen og flag-variablen.
Sæt, at vi ønsker at inkludere en sekvens af nummererede punkter i et dokument. Vi kan bruge en tællervariabel til at nummerere hvert punkt og skrive et par enkle kommandoer til at styre nummereringen. Figur 9 illustrerer dette. Tælleren deklareres ved hjælp af kommandoen \newcounter. Den sættes til en bestemt værdi ved hjælp af kommandoen \setcounter. Kommandoen \point bruges til at udskrive det aktuelle punktnummer og til at øge tælleren (for at tilføje en til dens værdi). Kommandoen \the<name>, for en eller anden tæller <name>, bevirker, at værdien af variablen udskrives. Denne kommando kan bruges med enhver variabel, ikke kun dem, som brugeren har indført, så f.eks. \thesection udskriver den aktuelle værdi af variablen section. I figur 9 bruger vi kommandoen \point til at udskrive tre punkter. En god egenskab ved denne fremgangsmåde er, at vi kan variere rækkefølgen af punkterne, og nummereringen vil ændre sig i overensstemmelse hermed.
Nu skal vi se, hvordan vi kan bruge variabler som flag til at vælge, hvilken tekst der skal produceres i et dokument. Som vi skal se, giver kombinationen af flag og makroer os mulighed for at skrive meget generiske dokumenter, som kan instantieres blot ved at vælge en passende værdi for flaget. Tag igen problemet med at skrive et dokument om arrays, hvor vi ønsker to former af kommandoen \lookup, en til Basic og en til C. Det ville være bedre, hvis vi kunne bruge et flag i vores LaTeX-kilde for at angive, om sproget skulle være C eller Basic. Det eneste, vi så skulle gøre, er at give flaget den korrekte værdi, inden vi kompilerer dokumentet. Figur 10 illustrerer dette.
Den første ting, der skal gøres, er at inkludere indstillingen ifthen i documentstyle-deklarationen. Dette gør det muligt for os at bruge kommandoen \ifthenelse senere hen. Dernæst erklærer vi en tællervariabel, language, som sættes til 1, hvis sproget skal være Basic, og til 0, hvis det skal være C. Symbolet % bruges af LaTeX til kommentarer; al tekst, der vises efter et %-symbol (og før linjens slutning), ignoreres af LaTeX-kompileren. Dernæst sætter vi tælleren til 1 ved hjælp af kommandoen \setcounter{language}{1}, så den tekst, vi skal producere, vil i dette tilfælde være specialiseret til Basic. Denne specialisering opnås ved hjælp af den modificerede version af kommandoen \lookup. Den nye version af \lookup bruger den indbyggede kommando \ifthenesle til at teste værdien af sprogvariablen. Formatet for en \ifthenelse-kommando er \ifthenelse{<test>}{<then_branch>}{<else_branch>}. Den opfører sig ligesom en if-anvisning i et konventionelt programmeringssprog. Hvis <test> evalueres til sand, produceres teksten i teksten i <then_branch>, hvis falsk, produceres teksten i <else_branch>.
Ved hjælp af dette flag kan vi skrive mange kommandoer, som hver især producerer teksten for en bestemt slags erklæring, idet sproget afhænger af værdien af flagets tællervariabel. På denne måde kan vi skrive et generisk dokument om programmering og blot sætte flaget korrekt for at producere den specialiserede version af dokumentet, vi ønsker.
Figur 10 viser, hvordan vi kan gøre dette. Vi definerer kommandoer, der producerer Basic- eller C-syntaks for arrayopslag (ved hjælp af makroen \lookup, som beskrevet ovenfor), arrayopdatering og, mere udførligt, en kommando, der producerer den passende syntaks for en for-loop. Den sidste af disse kræver en nærmere forklaring.
Forskellen mellem en for-loop i C og i Basic er i høj grad syntaktisk, og vi kan bruge fleksibiliteten i LaTeX til at slippe for disse syntaktiske detaljer. Kommandoen \forloop brugte flagetællersproget til at afgøre, om de fire elementer i løkken skulle udlægges i Basic- eller C-stil. Dette giver os mulighed for at skrive noget tekst om arrayinitialisering og loops uden at skulle beslutte, hvilket sprog måldokumentet skal henvise til.
Bemærk, at i C-versionen af for loop-syntaksen er de parenteser, der omslutter udsagnene i loopens krop, skrevet som \{ … \}, i stedet for som { … }. Det skyldes, at symbolerne for de krøllede parenteser allerede har en betydning for LaTeX, så for at få den til at udskrive de krøllede parenteser, sætter vi dem foran en backslash.
I figur 10 sætter vi tællersproget til 1, så det output, der produceres, vil være for Basic. Ud fra kildekoden i figur 10 vil LaTeX producere output i figur 11. Hvis vi ønsker at producere et dokument, der siger det samme om C arrays, skal vi blot ændre linjen \setcounter{language}{1} til \setcounter{language}{0}. Så let er det.
Matematik
LaTeX roses ofte (og med rette) for den måde, hvorpå den gør det muligt at skrive kompleks matematik. Mange moderne matematik-, datalogi- og andre videnskabelige og tekniske tekster er sat med LaTeX.
Matematisk tekst kan enten lægges in-line, i hvilket tilfælde den vises i den sætning, som den er skrevet i, eller i display mode, i hvilket tilfælde den vises centreret på en egen linje, der så at sige vises. Alle de matematiske standardsymboler og tekstformer er til rådighed ved hjælp af kommandoer. Da LaTeX har eksisteret i så lang tid og er blevet brugt, udviklet og forbedret af så mange matematikere verden over, er det yderst usandsynligt, at der findes nogen form for matematisk output, som ikke er blevet tilgodeset af nogen. En hurtig gennemgang af din bogreol vil sandsynligvis afsløre anerkendelser til LaTeX i flere lærebøger om datalogi og matematik, da det ofte bruges til at forberede tekniske bøger, så forfatterne kan levere en kameraklar kopi til deres forlag.
Der er også et blomstrende LaTeX-brugerfællesskab, som sikrer, at alle disse værdifulde oplysninger indsamles, vedligeholdes og opdateres. Alle LaTeX-udviklinger er fuldt ud bagudkompatible, så der er ingen grund til at bekymre sig om, at dine dokumenter på en eller anden måde bliver forældede.
genbrug
Jeg anslår, at det tager mellem to dage og en uge at blive produktiv med LaTeX. Mange læsere vil måske anse dette for uacceptabelt sammenlignet med den indkøringstid, der er for WYSIWYG-editorer. Hvis man kun skal udarbejde dokumenter som breve og notater, er LaTeX i hvert fald ikke værd at overveje. Men hvis du skal producere en stor mængde tekst og er parat til at investere i et system, der i sidste ende kan spare dig for flere måneders arbejde, så er LaTeX måske svaret.
En af de mest uhåndgribelige, men alligevel mest attraktive fordele, som LaTeX-brugere oplever, kommer fra den måde, hvorpå LaTeX ligesom et godt programmeringssprog understøtter genbrug. Meget hurtigt vil du opdage, at du opbygger et sæt af dine egne personlige makroer, som giver dig mulighed for at skræddersy dine dokumenter efter din egen smag. Genbrug af dele af et dokument i et andet dokument sker ubesværet og problemfrit. Den problemfrihed stammer fra to aspekter af LaTeX-tilgangen. Den symbolske navngivning af dele af et dokument gør det muligt at opdatere krydshenvisninger automatisk, når dokumentet redigeres. Begrebet miljø betyder, at det samme stykke kildetekst kan se forskelligt ud, når det indgår i forskellige kontekster. Dette er naturligvis i direkte modstrid med WYSIWYG-princippet, men det er den væsentlige styrke ved LaTeX. Mange edb-tidsskrifter , konferencer og forlag stiller deres egne LaTeX-stilfiler til rådighed, som, når de indgår i en LaTeX-kildefil, automatisk lægger dokumentet i den form, der kræves til offentliggørelse.
Hvor skal vi hen
Hvis du er interesseret i selv at prøve LaTeX, kan du få en MS-Windows-version (gratis) fra http://www.eece.ksu.edu/~khc/tex.html. LaTeX leveres som standard på de fleste UNIX-platforme og med de fleste Linux-distributioner, så hvis du bruger en af disse, kan du prøve at skrive man latex. Der findes et FTP-site med mange nyttige LaTeX-værktøjer, makroer og relaterede dokumenter på ftp.tex.ac.uk.
Der findes to uundværlige bøger om emnet LaTeX-dokumentskrivning. Begge er meget læseværdige og informative. LaTeX A Document Preparation System af Leslie Lamport (ISBN 0-201-15790-X), beskriver det grundlæggende system og er en rigtig god bog til at komme i gang med. Den indeholder nok information til at skrive umiddelbart de fleste normale dokumenter. The LaTeX Companion af Mike Goossens, Frank Mittelbach og Alexander Samarin (ISBN 0-201-54199-8), er mere detaljeret og dækker alle de nye funktioner, der er tilføjet LaTeX i forbindelse med LaTeX2e-projektet. Denne bog er nyttig, hvis man ønsker at skrive mange dokumenter med LaTeX og at tilpasse sproget til sin egen smag. Den forklarer, hvordan man opnår alle mulige eksotiske effekter, som f.eks. at lægge teksten ud i hjerteform (måske nyttigt for visse dokumenter, der er skrevet lige før den 14. februar). Begge disse bøger er udgivet af Addison-Wesley.
Logisk er bedre
LaTeX-dokumentforberedelsessystemet har udviklet sig og er blevet forbedret gennem årene. Det er ekstremt robust og indeholder funktioner til at skrive dokumenter efter publicerbare standarder, der indeholder tekst og matematik. Et LaTeX-dokument beskrives ved hjælp af et programmeringssprog, hvilket giver LaTeX-brugeren alle de muligheder og den fleksibilitet, som et konventionelt programmeringssprog giver. Skriftstilen tvinger brugeren til at se dokumenterne på deres logiske organisation og ikke på deres fysiske udseende. Dette er i begyndelsen lidt frustrerende, men i sidste ende har det mange fordele, f.eks. at det understøtter genbrug og skaber generiske dokumenter, som kan have flere fysiske instantiationer.
Mark Harman er forskningsdirektør og fungerende leder af School of Informatics and Multimedia Technology på University of North London (http://www.unl.ac.uk/~mark/welcome.html). Han kan kontaktes pr. e-mail på [email protected] eller pr. post til Mark Harman, Project Project, School of Informatics and Multimedia Technology, University of North London, Holloway Road, London N7 8DB.
Figur 1 Et simpelt LaTeX-dokument.
\documentstyle{article}
\begin{document}
hello world
\end{document}
Figur 2 Afsnit
\documentstyle{article}
\begin{document}
\section{Introduction}
Dette er et ret kort dokument, og dette er dets indledning.
\section{Rationale}
Dokumentet er så kort, fordi det blot er og eksempel.
\end{document}
Figur 3 Symbolske referencer
\documentstyle{article}
\begin{document}
\section{Introduction}
\label{intro}
Dette er et ret kort dokument, og dette er dets indledning.
\section{Rationale}
En kort introduktion til dette dokument kan findes i afsnit \ref{intro}.
\end{document}
Figur 4 Itemize-miljøet.
\begin{itemize}
\item Solid
\item Liquid
\item Liquid
\item Gas
\end{itemize}
Figur 5 Enumerate-miljøet.
\begin{enumerate}
\item Cenozoic
\begin{enumerate}
\item Quaternary
\item Tertiary
\end{enumerate}
\item Mesozoikum
\begin{enumerate}
\item Kridt
\item Jura
\item Trias
\end{enumerate}
\item Palæozoikum
\begin{enumerate}
\item Perm
\item Carboniferous
\item Devonian
\item Silurian
\item Ordovician
\item Cambrian
\end{enumerate}
\item Precambrian
\end{enumerate}
Figur 6 Parameterløse kommandoer.
\documentstyle{article}
\newcommand{\fruit} { apple }
\begin{document}
Den første \fruit, der dukker op, vil være den første \frugt, jeg skal spise.
\end{document}
Figur 7 Parametre: Grundlæggende version.
\documentstyle{article}
\newcommand{\lookup}
{ #1(#2) }
\begin{document}
For at finde det største element i arrayet A skal du gemme det første element, \lookup{A}{0}, i variablen b. Indtast derefter en løkke, styret af variablen i, der starter med 1 og fortsætter til arrayets ende. På hvert punkt i løkken sammenlignes element i, \lookup{A}{i}, med værdien i b. Hvis \lookup{A}{i} er større end b, tildeles \lookup{A}{i} til b.
\end{document}
Figur 8 Parametre: C version.
\documentstyle{article}
\newcommand{\lookup} { #1 }
\begin{document}
For at finde det største element i arrayet A skal du gemme det første element, \lookup{A}{0}, i variablen b. Indtast derefter en løkke, styret af variablen i, der starter med 1 og fortsætter til arrayets ende. På hvert punkt i sløjfen sammenlignes element i, \lookup{A}{i}, med værdien i b. Hvis \lookup{A}{i} er større end b, tildeles \lookup{A}{i} til b.
\end{document}
Figur 9 Tællervariabler.
\newcounter{pointnumber}
\setcounter{pointnumber}{1}
\newcommand{point}
\newcommand{point} { Point \point \thepointnumber \stepcounter{pointnumber} }
\point
En vis tekst tilknyttet et af punkterne
\point
En vis tekst tilknyttet et andet punkt
\point
Et andet punkt
Figur 10 Flagvariabler.
\documentstyle{article}
\newcounter{language} % sat til 1 for Basic og 0 for C
\setcounter{language}{1}
\newcommand{\lookup}
{
\ifthenelse{\value{language} = 1} {#1(#2)} {#1}
}
\newcommand{\update}
{
{
\ifthenelse{\value{language} = 1} {LET #1(#2) = #3} {#1 = #3}
}
% Kommandoen forloop tager fire parametre
% 1. Den nedre grænse for sløjfen – et heltal eller et integraludtryk.
% 2. Den øvre grænse for løkken – et heltal eller et integraludtryk.
% 3. Sløjfekontrolvariablen – en helhedsvariabel.
% 4. Løkkens krop – en sekvens af sætninger.
% Flaget tæller sprog, bruges til at bestemme det sprog, som
% syntaksen for løkken er skrevet i.
\newcommand{\forloop}
{
{
\ifthenelse{\value{language} = 1}
{
FOR #3 = #1 TO #2
NEXT #3
}
{
{
for(#3=#1;#3 != #2;#3++)
\{
\}
}
\begin{document}
For at gemme værdien 10 i element nummer 3 i arrayet A, skriver vi \update{A}{3}{10}.
For at initialisere elementerne 0 til og med 10 i arrayet A med startværdien 0 kan vi bruge en for-løkke, der starter ved 0 og går op til 10. Dette ville blive skrevet således
\forloop{0}{10}{i}{\update{A}{i}{0}}}
\end{document}
Figur 11 Resultatet af kompileringen af LaTeX-kilden i Figur 10.
For at gemme værdien 10 i element nummer 3 i arrayet A, skriver vi LET A(3) = 10.
For at initialisere elementerne 0 til og med 10 i arrayet A med startværdien 0 kan vi bruge en for-løkke, der starter ved 0 og går op til 10. Dette ville blive skrevet således
FOR i = 0 TIL 10
LET A(i) = 0
NEXT i
(P)1997, Centaur Communications Ltd. EXE Magazine er en udgivelse af Centaur Communications Ltd. Ingen dele af dette værk må offentliggøres, hverken helt eller delvist, på nogen måde, herunder elektronisk, uden udtrykkelig tilladelse fra Centaur Communications og indehaveren af ophavsretten, hvis denne er en anden part.
EXE Magazine, St Giles House, 50 Poland Street, London W1V 4AX, e-mail [email protected]