% Tekijä:   Teemu Likonen <tlikonen@iki.fi>
% Lisenssi: Creative Commons Nimeä-JaaSamoin 4.0 Kansainvälinen (CC BY-SA 4.0)
% https://creativecommons.org/licenses/by-sa/4.0/legalcode.fi

\chapter{Muuta tekniikkaa}

Tähän päälukuun on koottu sekalaisia ohjeita, jotka eivät oikein sovi
mihinkään aiempaan päälukuun. Kyse on sellaisesta Latexin tekniikasta,
jota voi hyödyntää monenlaisissa dokumenteissa ja tilanteissa.

\section{Päiväykset ja kellonajat}

Latexissa on muutama komento, joilla voi latoa dokumenttiin
automaattisesti kääntämishetken päivämäärän. Sellaista voidaan tarvita
esimerkiksi dokumentin kansi- tai nimiösivulle ilmaisemaan
julkaisuajankohtaa. Yleisimmin käytetty komento lienee \komento{today},
joka latoo nykyisen kielivalinnan (luku \ref{luku/kieliasetukset})
mukaisen pitkän päivämäärän:

\komentoi{today}
\begin{koodilohkosis}
\today
\end{koodilohkosis}

\begin{tulossis}
  12. kesäkuuta 2023
\end{tulossis}

\noindent
Edellä on esimerkki suomen kielen kokonaisesta päiväysmerkinnästä.
Muilla kielillä komento tuottaa tietenkin jotain muuta. Päivämäärään
sisältyvät lukuarvot voi latoa kahden komennon yhdistelmillä: ensin
annetaan komento \komento{the} ja sen jälkeen päivää, kuukautta tai
vuotta ilmaiseva komento, kuten seuraavasta esimerkistä ilmenee.

\komentoi{the}
\komentoi{day}
\komentoi{month}
\komentoi{year}
\begin{koodilohkosis}
\the\day.\the\month.\the\year
\end{koodilohkosis}

\begin{tulossis}
  12.6.2023
\end{tulossis}

\noindent
Monipuolisempia ajanilmauksia voi latoa paketin \pakettictan{datetime2}
avulla. Se sisältää paljon komentoja ajanilmausten tuottamiseen eri
muodoissa ja eri kielillä. \paketti{datetime2}\-/ paketti pitäisi ladata
kieliasetusten (luku \ref{luku/kieliasetukset}) ja kielipaketin jälkeen,
ja lataamisen yhteydessä voi asettaa, minkä kielten mukaisesti
ajanilmaukset halutaan latoa. Seuraavassa esimerkissä ladataan suomen
(\koodi{finnish}) ja brittienglannin (\koodi{en-GB}) ajanilmaukset sekä
asetetaan, että kellonajoissa ei ole sekunteja mukana.

\pakettii{datetime2}
\begin{koodilohkosis}
% Ensin kielipaketti polyglossia tai babel. Sitten:
\usepackage[finnish, en-GB, showseconds=false]{datetime2}
\end{koodilohkosis}

\noindent
Ajanilmausten kielen tai muun tyylin voi muuttaa komennolla
\komento{DTMsetstyle}, kuten seuraava esimerkki osoittaa. Dokumentin
kääntämishetken päiväys ladotaan komennolla \komento{DTMtoday}, joka
vastaa perus Latexin \komento{today}\-/ komentoa. Nykyhetken kellonaika
saadaan komennolla \komento{DTMcurrenttime}.

\komentoi{DTMsetstyle}
\komentoi{DTMtoday}
\komentoi{DTMcurrenttime}
\begin{koodilohkosis}
\DTMsetstyle{finnish}
Tänään on \DTMtoday\ ja kello on \DTMcurrenttime. \\
\DTMsetstyle{en-GB}
Today is \DTMtoday\ and the time is \DTMcurrenttime.
\end{koodilohkosis}

\begin{tulossis}
  Tänään on 12. kesäkuuta 2023 ja kello on 10.46. \\
  Today is 12th June 2023 and the time is 10:46am.
\end{tulossis}

\noindent
Pitkän päivämäärän sijasta on mahdollista latoa myös pelkistä luvuista
koostuva päiväys. Tämä vaatii, että ajanilmausten tyyliä muutetaan
komennolla \komento{DTMsetstyle}. Esimerkiksi suomen kielelle on
olemassa tyyli \koodi{finnish-numeric} eli numeeristen päiväysten tyyli.

\komentoi{DTMsetstyle}
\komentoi{DTMtoday}
\begin{koodilohkosis}
\DTMsetstyle{finnish-numeric}
\DTMtoday
\end{koodilohkosis}

\begin{tulossis}
  12.6.2023
\end{tulossis}

\noindent
\paketti{datetime2}\-/ paketissa on myös komentoja minkä tahansa
päivämäärän tai kellonajan latomiseen, ei pelkästään nykyhetken.
Peruskomento päiväyksille on \komento{DTMdisplaydate}, jota käytetään
seuraavasti:

\komentoi{DTMdisplaydate}
\begin{koodilohkosis}
\DTMdisplaydate{vuosi}{kuukausi}{päivä}{viikonpäivä}
\end{koodilohkosis}

\noindent
Komennon kaikki argumentit ovat lukuja. Viimeinen argumentti on
viikonpäivän numero: \koodi{0}~on maanantai, \koodi{1}~on tiistai jne.
Kaikki ajanilmaustyylit tai \=/kielet eivät huomioi viikonpäivää
mitenkään. Esimerkiksi suomen kielellä sitä ei huomioida. Argumentiksi
voi asettaa \koodi{-1}, jolloin viikonpäivä jätetään aina huomioimatta.

\komentoi{DTMsetstyle}
\komentoi{DTMdisplaydate}
\begin{koodilohkosis}
\DTMsetstyle{finnish} Suomi julistautui itsenäiseksi
\DTMdisplaydate{1917}{12}{6}{-1}. \\
\DTMsetstyle{en-GB} Finland declared its independence on
\DTMdisplaydate{1917}{12}{6}{-1}.
\end{koodilohkosis}

\begin{tulossis}
  Suomi julistautui itsenäiseksi 6. joulukuuta 1917. \\
  Finland declared its independence on 6th December 1917.
\end{tulossis}

\noindent
Yleensä lienee kätevämpää kirjoittaa kiinteät päivämäärät ja muut
ajanilmaukset ihan normaalina tekstinä eikä minkään komennon avulla.
Komento \komento{DTMdisplaydate} voi kuitenkin olla hyödyllinen silloin,
kun päiväys tuotetaan teknisesti laskemalla tai kun saman Latex\-/
koodin avulla tuotetaan ajanilmauksia useiden erikielisten dokumenttien
osaksi. Tai ehkä kirjoittaja ei tunne kohdekielen ajanilmausten
merkintätapoja ja luottaa, että \paketti{datetime2}\-/ paketin avulla ne
saa oikeanlaiseksi~(?).

Mitä hyvänsä kellonaikoja saa ladottua komennolla
\komento{DTMdisplaytime}, joka huomioi voimassa olevat kieli- tai
tyyliasetukset. Komennolle annetaan kolme argumenttia: tunnit, minuutit
ja sekunnit. Sekunteja ei kuitenkaan näytetä, jos \paketti{datetime2}\-/
paketin lataamisen yhteydessä on käytetty asetusta
\koodi{showseconds=\katk false}.

\komentoi{DTMsetstyle}
\komentoi{DTMdisplaytime}
\begin{koodilohkosis}
\DTMsetstyle{finnish} \DTMdisplaytime{11}{43}{27}
\DTMsetstyle{en-GB}   \DTMdisplaytime{11}{43}{27}
\end{koodilohkosis}

\begin{tulossis}
   11.43 11:43am
\end{tulossis}

\noindent
Paketti \paketti{datetime2} sisältää paljon muitakin ominaisuuksia ja
komentoja ajanilmausten käsittelyyn ja latomiseen. Paketin hyödyt
korostuvat erityisesti silloin, kun tarvitaan automaattisia
ajanilmauksia eri kielillä. Tarkempaa tietoa on luettavissa paketin
ohjekirjasta, mutta seuraavassa on vielä yksi esimerkki tilanteesta,
jossa puhutaan jostakin kuukaudesta, ilman että kirjoitusvaiheessa
tiedetään, mistä kuukaudesta on kyse.

\komentoi{DTMsavenow}
\komentoi{DTMfinnishMonthname}
\komentoi{DTMfetchmonth}
\komentoi{DTMfetchyear}
\begin{koodilohkosis}
\DTMsavenow{nyt}
\DTMfinnishMonthname{\DTMfetchmonth{nyt}}ssa vuonna \DTMfetchyear{nyt}
eli tämän tekstin julkaisun aikaan -- --.
\end{koodilohkosis}

\begin{tulossis}
  \DTMsavenow{nyt}
  \DTMfinnishMonthname{\DTMfetchmonth{nyt}}ssa vuonna \DTMfetchyear{nyt}
  eli tämän tekstin julkaisun aikaan -- --.
\end{tulossis}

\section{Vapaasti sijoitettava sisältö}

Vapaasti sijoitettava sisältö tarkoittaa tässä sellaista tekstiä, kuvia
tai muuta sisältöä, joka ei ole osa normaalia tekstivirtaa.
Tavallisestihan Latex latoo kirjaimia peräkkäin riveiksi ja kappaleiksi
niin, että sisältö virtaa sujuvasti sivulta toiselle.

Paketin \pakettictan{textpos} avulla voi kuitenkin sijoittaa sivulle
sisältöä siten, että se on irrallaan normaalista tekstivirrasta.
Esimerkiksi tekstiä tai kuvia voi sommitella absoluuttisesti tiettyihin
kohtiin sivulle tai kuvan voi sijoittaa normaalin tekstin taakse.

Paketin lataamisen yhteydessä valitaan joko suhteellinen tai
absoluuttinen sisällön sijoittelu, eli käytetäänkö valitsinta
\koodi{absolute} vai ei. Myöhemmin selviää, mitä ne käytännössä
tarkoittavat.

\pakettii{textpos}
\begin{koodilohkosis}
\usepackage{textpos}            % oletus eli suhteellinen sijoittelu
\usepackage[absolute]{textpos}  % absoluuttinen sijoittelu
\end{koodilohkosis}

\noindent
\paketti{textpos}\-/ paketti määrittelee ympäristön nimeltä
\ymparisto{textblock}, jonka sisällä olevat asiat ovat kokonaan tai
osittain irrallaan tavallisesta tekstivirrasta. Ympäristö itse ei vie
sivulta tilaa lainkaan, eli normaalin tekstivirran näkökulmasta se on
näkymätön. Ympäristö vaatii tiettyjä argumentteja, joiden muoto on
seuraava:

\ymparistoi{textblock}
\begin{koodilohkosis}
\begin{textblock}{leveys}(x,y)
  ...
\end{textblock}
\end{koodilohkosis}

\noindent
Ympäristön ensimmäinen argumentti \koodi{leveys} on laatikon leveys, ja
ympäristön toinen argumentti \koodi{(x,y)} ilmaisee sisällön x- ja
y-koordinaatit. Nämä eivät ole mittoja vaan kertoimia eli mittalukuja,
joiden yksikkönä on mitta \mitta{TPHorizModule} (leveys ja
x-koordinaatti) ja \mitta{TPVertModule} (y-koordinaatti). Mitat voi
asettaa \komento{setlength}\-/ komennolla.

\komentoi{setlength}
\mittai{TPHorizModule}
\mittai{TPVertModule}
\begin{koodilohkosis}
\setlength{\TPHorizModule}{10mm}  % vaakasuuntainen yksikkö
\setlength{\TPVertModule} {10mm}  % pystysuuntainen yksikkö
\end{koodilohkosis}

\noindent
Edellä olevat komennot asettavat sekä vaaka- että pystysuuntaiseksi
yksiköksi 10\,mm, joten seuraavassa esimerkissä laatikon leveydeksi
tulee 50\,mm ja sen sijainti on 70\,mm oikealle ja 35\,mm alas.

\ymparistoi{textblock}
\begin{koodilohkosis}
\begin{textblock}{5}(7,3.5)
  Tämä teksti ei ole osa normaalia tekstivirtaa.
\end{textblock}
\end{koodilohkosis}

\noindent
Jos \paketti{textpos}\-/ paketti ladattiin suhteellisessa
sijoittelutilassa eli ilman \koodi{absolute}\-/ valitsinta,
\ymparisto{textblock}\-/ ympäristön x- ja y-koordinaattien origo on
juuri siinä kohdassa, missä ympäristö sijaitsee sivun normaalissa
tekstivirrassa. Niinpä esimerkiksi miinusmerkkinen y-koordinaatti
sijoittaa ympäristön sisältöä kyseisen kohdan yläpuolelle.

Jos paketti ladattiin absoluuttisessa tilassa eli käyttämällä
\koodi{absolute}\-/ valitsinta, on koordinaattien origo nykyisen sivun
vasemmassa ylänurkassa (oletuksena). Origon voi siirtää komennolla
\komento{textblockorigin}, ja sille argumentiksi annetut koordinaatit
siirtävät origon vasemmasta ylänurkasta oikealle ja alas. Seuraava
esimerkki siirtää origon leveyssuunnassa sivun keskelle ja
pystysuunnassa 5\,cm alas sivun yläreunasta.

\komentoi{textblockorigin}
\mittai{paperwidth}
\begin{koodilohkosis}
\textblockorigin{.5\paperwidth}{5cm}
\end{koodilohkosis}

\noindent
\ymparisto{textblock}\-/ ympäristön luoman laatikon rajat voi tarkistaa
antamalla paketin lataamisen yhteydessä valitsimen \koodi{showboxes}.
Näin laatikon reunaviivat piirretään näkyviin. Varsinkin sommittelutyön
alkuvaiheessa on usein hyödyllistä nähdä, missä laatikot tarkalleen
ovat.

\pakettii{textpos}
\begin{koodilohkosis}
\usepackage[showboxes]{textpos}
\end{koodilohkosis}

\noindent
Kuten edellä jo todettiin, ympäristö \ymparisto{textblock} ei käytä
argumenteissaan mittoja vaan kertoimia, jotka ovat suhteessa mittoihin
\mitta{TPHorizModule} ja \mitta{TPVertModule}. Ympäristöstä on kuitenkin
myös tähdellinen versio \ymparisto{textblock*}, jonka argumenteissa
käytetään nimenomaan mittoja.

\ymparistoi{textblock*}
\begin{koodilohkosis}
\begin{textblock*}{10cm}(3cm,2cm)
  Tämän laatikon leveys on 10 cm, ja se sijaitsee origosta 3 cm
  oikealle ja 2 cm alas.
\end{textblock*}
\end{koodilohkosis}

\noindent
Ympäristöt latovat sisältönsä sivulle kerroksittain siten, että sivulla
ensin oleva \ymparisto{textblock}\-/ sijaitsee alimpana ja seuraavat
ympäristöt ladotaan edellisten päälle -- mikäli niiden sisältö
ylipäätään sattuu päällekkäin.

Absoluuttisessa sijoittelutilassa (paketin \koodi{absolute}\-/ valitsin)
\ymparisto{textblock}\-/ ympäristöjen sisältö sijaitsee kaiken normaalin
tekstin alla. Tämän voi kuitenkin muuttaa käyttämällä paketin valitsinta
\koodi{overlay}, joka tuo ympäristöjen sisällön normaalin tekstin
päälle.

Paketin asetuksia voi muuttaa lataamisen jälkeen komennolla
\komento{TPoptions}. Komennon argumenttiin kirjoitetaan valitsimia, ja
niiden arvoksi annetaan joko \koodi{true} (kytke päälle) tai
\koodi{false} (kytke pois).

\komentoi{TPoptions}
\begin{koodilohkosis}
\TPoptions{absolute=false, showboxes=true}
\end{koodilohkosis}

\noindent
Tässä alaluvussa esiteltiin ehkä tärkeimmät \paketti{textpos}\-/ paketin
ominaisuudet ja niiden käyttäminen. Hieman muitakin ominaisuuksia on.
Esimerkiksi ympäristöjen sijoittelun kohdistusruudukon saa näkyviin ja
määriteltyä omalla komennollaan. Laatikoiden reunaviivojen leveyden ja
värin sekä sisällön marginaalin voi asettaa. Lisätietoa on luettavissa
paketin ohjekirjasta.
