David Steinsland

Skrive og kompilere LaTeX i Notepad++

| Ingen kommentarer »

Flere ganger har jeg skrevet om Notepad++ og hvordan du enkelt kan utvide funksjonaliteten til programmet. Forrige gang skrev jeg om hvordan du kunne kompilere og kjøre Java-applikasjoner.
Denne gangen handler det om LaTeX og hvordan du kan skrive LaTeX-dokumenter i Notepad++, samt hvordan du får dem over til PDF- eller PostScript-format.

Før vi går i gang …

For at ting skal gå knirkefritt for deg så bør du helst leste artikkelen jeg skrev om kompilering av Java i Notepad++, spesielt om hvordan du installerer NppExec.
Deretter må du sørge for at du har installert MiKTeX, som er nødvendig for å kunne kompilere LaTeX.

Steg 1: Opprette batch-filer

Innstikket NppExec gir oss muligheten til å kjøre kommandoer direkte i Notepad++, og gjerne med en hurtigtast. Vi skal bruke dette innstikket til å kjøre to forskjellige batch-filer, som skal stå for å kompilere LaTeX til PDF eller PostScript.

Opprett en batch-fil med navnet «latex-pdflatex.bat». I denne filen skriver du inn følgende kode:

cd %1
pdflatex.exe %2

Denne batch-filen har som oppgave å kompilere et TeX-dokument direkte til PDF.

Deretter må du opprette en ny batch-fil med navnet «latex-postscript.bat». Denne filen skal brukes dersom LaTeX-dokumentet inneholder vektorgrafikk, for da må dokumentet gjøres om til PostScript først (PostScript-filer kan enkelt konverteres til PDF senere).

Filen må inneholde følgende kode:

cd %1

latex.exe -src-specials %2.tex
dvips.exe %2

Dette programmet sørger for at LaTeX-dokumentet blir gjort om til en .dvi-fil, for så til PostScript.

Steg 2: Opprette makroer i Notepad++

For å finne ut hvordan du oppretter makroer i Notepad++, anbefaler jeg deg å lese forrige artikkel jeg skrev om emnet. Du følger samme prosedyre som beskrevet der, bare du bytter ut navnet på makroen samt kommandoen. Det er også beskrevet hvordan du kan tilegne tastatursnarveier til makroene.

LaTeX: til PDF

latex-pdflatex.bat "$(CURRENT_DIRECTORY)" $(NAME_PART)"

LaTeX: til PDF (grafikk)

latex-postscript.bat "$(CURRENT_DIRECTORY)" $(NAME_PART)"

Dersom du har fått alt på plass, så er det bare til å begynne å skrive!

Java: Primtallgenerering og -faktorisering

| Ingen kommentarer »

Hvordan kan man finne alle primtall mindre enn k? Hvordan sjekke om et gitt heltall n er primtall? Hvordan kan vi primtallsfaktorisere ethvert tall?

Først av alt må man etablere et par matematiske sannheter:

  1. Et primtall er et helt tall større enn 1 som bare er delelig med seg selv og med 1
  2. Et heltall k er også primtall dersom det ikke er delelig med andre primtall mindre enn eller lik kvadratrota til k.
  3. Et hvert heltall større enn 1 kan skrives som produktet av ett eller flere primtall.

Så, hvordan kan man finne et primtall?

  1.  Gitt et heltall k, begynner vi å sjekke om tallet er delelig med det minste primtallet, 2.
  2. Om det er delelig, kan vi trekke konklusjonen om at tallet ikke er primtall.
  3. Dersom det ikke er delelig, går vi videre til 3. Dette gjentar vi for alle primtall \leq \sqrt{k}.
  4. Om ingen tall er delelige, er tallet et primtall.

Vi kan nå begynne å skrive Java-koden vår, og en kan for eksempel ende opp med noe slikt:


public boolean isPrime (int n)
{
	int q = (int) Math.sqrt (n);

	boolean isPrime = true;

	for (int i = 2; i < q; i++)
 	{
		if (n % i == 0)
		{
			return false;
		}
	}

	return true;
}

Det første vi gjør er å ta kvadratrota til heltallet vårt. Deretter kjører vi gjennom alle heltall 2 \leq i \leq \sqrt{n}. Dersom tallet skulle være delelig med et annet, da er det ikke et primtall. Når løkken er gjennomført, vet vi at ingen tall er delelige og at heltallet vårt er primtall.

Primtallsfaktorisering

Ved aritmetikkens fundamentalteorem vet vi at et heltall større enn 1 er enten et primtall, eller et produkt av ett eller flere primtall.

For eksempel er: 7007 = 7 \cdot 7 \cdot 11 \cdot 13


public Integer[] primeFactorization (int a)
{
	ArrayList factors = new ArrayList();

	// fetch primes less than or equal to sqrt(a).
	// if no primes are returned, the number itself is a prime.
	Integer[] primes = primes ((int)Math.sqrt(a));

	int i = 0;
	while (i < primes.length)
 	{
 		int p = primes[i];
 		if (Arrays.asList (primes).contains(a) || isPrime (a))
 		{
 			// the remaining number is now a prime.
 			break;
 		}
 		if (a % p == 0)
 		{
 			// add the prime to our list, and execute the division
 			factors.add (p);
 			a = a / p;
 		}
 		else
 		{
 			// Continue to next prime, if the current one does not
 			// divide
 			i++;
 		}
 	}
 	// The number than remains should be a prime itself.
 	if (a > 1)
	{
		factors.add (a);
	}

	return (Integer[]) factors.toArray(new Integer[factors.size()]);
}

Her ble det kanskje litt komplisert med det første, men prosessen er igrunn ganske enkel:

  1. primes() til å gi oss et int-array med primtall (bruker funksjonen isPrime())
  2. Deretter går vi gjennom alle primtallene, og sjekker om tallet a er delelig med p. Dersom det er delelig, så legger vi primtallet p i samlingen vår og utfører divisjonen \frac{a}{p}.
  3. I neste runde tester vi enten det samme primtallet som i forrige runde, eller så tester vi det neste primtallet. Det er først når det gjeldende primtallet ikke er delelig, at vi går til neste.
  4. Til slutt skal det resterende tallet selv være et primtall, men vi ønsker ikke å inkludere tallet 1 som faktor.

Eksempel

Om vi bruker tallet 7007 om igjen, så vil vi i Java-funksjonen få følgende primtall:

{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83}. Det er alle primtall som er mindre enn kvadratroten til 7007.

Deretter tester vi først om 2 er delelig med 7007. Det er det ikke, så vi går videre til neste primtall. Det er først når vi kommer til 7 at vi finner et primtall som er delelig med 7007.

Vi legger da til tallet 7 i listen vår, og utfører divisjonen \frac{7007}{7} = 1001. I neste runde tester vi tallet 7 en gang til, og igjen så er det delelig. Vi utfører da \frac{1001}{7} = 143.

Når vi i påfølgende runde tester 7 igjen, finner vi ut at det ikke lengre er delelig. Men det er primtallet 11! Det siste primtallet vil da være 13.

Dette gir oss følgende i resultat: {7, 7, 11, 13} som forteller oss hvilke primtallsfaktorer som gir 7007.

Java: Kompiler og kjør, direkte fra Notepad++

| Ingen kommentarer »

Da jeg startet på Informasjonsteknologi ved HiOA, ble mange anbefalt å skrive Java i en IDE som Eclipse eller Netbeans fremfor teksteditor. Dette ble nok godtatt av de fleste, men for de av oss som har sverget troskap til Notepad++ er det vanskeligere å godta.

Etter litt søking rundt om, fant jeg frem til en løsning som lar deg kompilere og kjøre Java-kode direkte i fra Notepad++ med et par tastetrykk!

1. Installer NppExec

NppExec er en plugin til Notepad++ som lar deg kjøre kommandoer, og du vil finne denne i Plugin Manager. Gå til: Plugins → Plugin Manager → Show Plugin Manager.

I denne listen vil du finne NppExec. Huk av i avkryssningsboksen og trykk Install.

2. Opprett batch

For å kunne kjøre Java-applikasjoner måtte jeg opprette en egen batch-fil for dette. Lag en fil som heter RunJava.bat, og lim inn dette:


cd %1
java -cp . %2
pause

3. Lage makroer

Makroer  er små miniprogrammer egnet for å utføre små oppgaver, som du kan lage med NppExec.

Trykk F6, lim inn følgende kommando:

D:\bin\JavaRun.bat "$(CURRENT_DIRECTORY)" $(NAME_PART)

Trykk så Save, og kall makroen for Java Run.

For å kompilere Java-kode behøver du ingen batch-filer, bare en spesiell kommando.

Trykk F6, velg <temporary script> fra nedtrekksmenyen, og lim inn kommandoen:

cd $(CURRENT_DIRECTORY)
javac "$(FILE_NAME)"

Lagre den som Java Compile.

4. Plassere makroene i meny

Gå til Plugins → NppExec → Advanced Options

I listen under «Associated Script» velger du Java Run. I boksen inder «Item name» skriver du: Java Run Application. Trykk så på Add/modify.

Gjenta samme prosedyre én gang til, bare denne gangen velger du Java Compile og skriver inn Java Compile Application under «Item name».

Trykk OK, og finn frem Macro i hovedmenyen. Du vil nå se dine makroer i listen nederst.

5. Tilegne tastatursnarveier

Det er greit å kunne ha en tastatursnarvei for disse makroene, spesielt fordi de vil bli benyttet ofte.

I hovedmenyen velg Run → Modify Shortcut/Delete Command. Deretter velger du «Plugin Commands», og finn frem til Java Run Application og Java Compile Application. Dobbeltklikk på hver av dem, og du vil få mulighet om å tilegne makroen en tastatursnarvei.

OBS! Pass på at det ikke oppstår konflikt med andre snarveier. Notepad++ håndterer slikt dårlig, og du vil derfor måtte fjerne en eksisterende snarvei før du kan bruke den på ny.

Gå til

Tips: Enkle feilmeldinger med animasjon

| Ingen kommentarer »

errorbox

Her følger en liten kodesnutt som viser en feilmelding i ca. fem sekunder før den fjernes igjen. I dét feilmeldingen vises, blir bakgrunnsfargen forsterket for å få en «se her!»-opplevelse. Dersom musen blir holdt over feilmeldingen, blir den ikke fjernet før etter musepekeren er fjernet fra den.

For å få koden til å fungere trenger du jQuery og jQuery UI.

JavaScript:

$(function ()
{
	$('div.message').hide().effect ('highlight', {
		color:'#ff8a8a'
	}, 2000).delay(3000).animate({
		height: 'toggle',
		opacity: 'toggle'
	}, 'slow').hover (function ()
	{
		$(this).stop(true, true);
	}, function ()
	{
		$(this).delay(2000).animate({ height: 'toggle', opacity: 'toggle' }, 'slow');
	});
});

Om du studerer JavaScript-koden, vil du se at vi bruker effekten «Highlight». Effekten angir feilmeldingsboksen med angitt bakgrunnsfarge, før den fader tilbake til bakgrunnsfargen som er satt i CSS. Alternativt kan en benytte seg av «pulsate», som også gir en ganske behagelig animasjon:

 $(function() {
    $('div.message').hide().effect('pulsate', {
        times: 2
    }, 450).delay(4000).animate({
        height: 'toggle',
        opacity: 'toggle'
    }, 'slow').hover(function() {
        $(this).stop(true, true);
    }, function() {
        $(this).delay(2000).animate({
            height: 'toggle',
            opacity: 'toggle'
        }, 'slow');
    });
});

Pulsate-effekten her veksler mellom å skjule/vise feilmeldingsboksen iløpet av 450 millisekunder.

CSS:

div.message
{
    display:none;
    border:1px solid;
    padding:10px;
    color: #D8000C;
    background-color:#FFBABA;
}

div.message h4
{
    font-weight:bold;
    font-size:14px;
}

div.message p
{
    padding:5px 0;
    font-size:12px;
}

HTML:

<div class="message">
    <h4>An Error has Occured!</h4>
    <p>
        There was a problem while editing the article. Your data has been saved, and you can go <a href="#">back</a> to continue editing.
    </p>
    <p>
        Error ID: #1337
    </p>
</div>

Resultatet:

Klikk på «Result» i vinduet under.

Eget vindu