LaTeX/Običan TeH

Izvor: Викикњиге

LaTeX

Početak
  1. Uvod100% završen  Dec 13, 2015
  2. Instalacija100% završen  Dec 13, 2015
  3. Instalacija dodatnih paketa 100% završen  Dec 13, 2015
  4. Osnove 100% završen  Dec 13, 2015
  5. Kako pronaći pomoć 100% završen  Dec 13, 2015

Zajednički elementi

  1. Struktura dokumenta 100% završen  Dec 28, 2015
  2. Formatiranje teksta 100% završen  Dec 27, 2015
  3. Formatiranje paragrafa 100% završen  Jan 02, 2016
  4. Boje 100% završen  Jan 10, 2016
  5. Slova100% završen  Jan 10, 2016
  6. Struktura listi 100% završen  Jan 10, 2016
  7. Posebni znakovi 100% završen  Jan 10, 2016
  8. Internacionalizacija 100% završen  Jan 10, 2016
  9. Rotacija 100% završen  Jan 10, 2016
  10. Tabele 100% završen  Jan 10, 2016
  11. Stvaranje naslova 100% završen  Jan 10, 2016
  12. Raspored strane 100% završen  Jan 10, 2016
  13. Uvoz grafike 100% završen  Jan 10, 2016
  14. Figure i natpisi100% završen  Jan 10, 2016
  15. Fusnote i Margine100% završen  Jan 10, 2016
  16. Hiperlinkovi 100% završen  Jan 10, 2016
  17. Oznake i referenciranje100% završen  Jan 10, 2016

Mehanika

  1. Greške i upozorenja 75% završen  Jan 02, 2016
  2. Dužine 100% završen  Jan 02, 2016
  3. Brojači 100% završen  Jan 02, 2016
  4. Kutije 100% završen  Jan 02, 2016
  5. Pravila i nosači 100% završen  Jan 02, 2016

Tehnički tekstovi

  1. Matematika100% završen  Jan 10, 2016
  2. Naprednija matematika 75% završen  Jan 10, 2016
  3. Teoreme
  4. Hemijska grafika 75% završen  Jan 02, 2016
  5. Algoritmi 75% završen  Jan 02, 2016
  6. Listiranje izvornog koda 100% završen  Jan 02, 2016
  7. Lingvistika 75% završen  Jan 02, 2016

Posebne strane

  1. Indeksiranje 75% završen  Jan 02, 2016
  2. Rečnik 75% završen  Jan 02, 2016
  3. Upravljanje bibliografijom‎ 75% završen  Jan 10, 2016
  4. Više bibliografije

Posebni dokumenti

  1. Pisma 50% završen  Jan 02, 2016
  2. Prezentacije 75% završen  Jan 02, 2016
  3. Učiteljski deo 75% završen  Jan 10, 2016
  4. Kratka biografija 50% završen  Jan 02, 2016

Kreiranje grafika

  1. Predstavljanje proceduralnih grafika 100% završen  Jan 02, 2016
  2. MetaPostovi 0% završen  Jan 02, 2016
  3. Slika 50% završen  Jan 02, 2016
  4. PGF/TikZ 25% završen  Jan 02, 2016
  5. PSTricks 50% završen  Jan 02, 2016
  6. Xy-pic 25% završen  Jan 02, 2016
  7. Pravljenje 3D grafika 75% završen  Jan 02, 2016

Programiranje

  1. Makroi 100% završen  Jan 10, 2016
  2. Običan TeH‎ 100% završen  Jan 10, 2016
  3. Kreiranje paketa 100% završen  Jan 10, 2016
  4. Teme 75% završen  Jan 10, 2016

Razno

  1. Modularni Dokumenti 100% završen  Jan 10, 2016
  2. Zajedničko pisanje LaTeX dokumenata 75% završen  Jan 10, 2016
  3. Otpremanje u druge formate 100% završen  Jan 10, 2016

Pomoć i preporuke

  1. Najčešće postavljana pitanja 100% završen  Jan 10, 2016
  2. Saveti i trikovi 75% završen  Jan 10, 2016

Dodaci

  1. Autori 0% završen  Jan 10, 2016
  2. Linkovi 0% završen  Jan 10, 2016
  3. Oznake paketa 0% završen  Jan 10, 2016
  4. Primeri LaTeX dokumenata 0% završen  Jan 10, 2016
  5. Indeks 0% završen  Jan 10, 2016
  6. Rečnik naredbi 0% završen  Jan 10, 2016

Dok se igrate LaTeH makroom, primetićete da je prilično ograničen. Možda se pitate kako svi su ovi paketi koje koristite svaki dan sprovedeni sa tako malo. U stvari, LaTeH je skup makroa Običnog TeH-a i većina paketa koristi Običan TeH kod. Običan TeH je mnogo niskog nivoa, ima mnogo više mogućnosti po ceni strme krive učenja i složenog programiranja.

Do nekoliko izuzetaka, možete koristiti pun jezik Običnog TeH-a okviru važećeg dokumenta LaTeH dok je suprotno netačno.

Vokabular[uredi]

Da bi se izbegla konfuzija, neophodno je objasniti neke termine.

  • Grupa je sve nakon otvaranja brejsa i posle poređenja zatvaranja brejsa.
  • Token je karakter, kontrolna sekvenca, ili grupa.
  • Kontrolna sekvenca je nešto što počinje sa \. Ne štampa se kao što jeste, ona se proširila po TeHu motora prema svojoj vrsti.
  • Komanda (ili funkcija ili makro ) je kontrolna sekvenca koja se može proširiti i na teksta, (ponovno) definisanje kontrolnih sekvenci, itd.
  • Primitiva je komanda koja je teško kodirana u TeH motoru, odnosno nije zapisana u Običnom TeH-u.
  • Registar je TeH način da se rukuje promenljivama. Oni su ograničeni u brojkama (256 za svaku vrstu registra u klasičnom TeHu, 32767 u e-TeHu).
  • Dužina je kontrolna sekvenca koja sadrži dužinu (broj zatim sledi jedinica). Pogledajte Dužina.
  • Font je kontrolna sekvenca koji se odnosi na font fajl. Pogledajte Fontovi.
  • Kutija je objekat koji je napravljen za štampanje. Sve što se završava na papiru je kutija: pisma, stavovi, stranice ... Pogledajte Kutije.
  • Lepak je određena količina prostora koji se stavlja između kutija kada su spojene.
  • Brojač je registar koji sadrži broj. Pogledajte Brojači.

Može postojati više termina, ali se nadamo da će ovo biti dovoljno za sada.

Ketkodovi[uredi]

U TeHu neki karakteri imaju posebno značenje koje nije za štampanje povezano sa glifom. Na primer, \ se koristi za uvođenje kontrolne sekvence, a neće štampati kosu crtu podrazumevano.

Za razliku između različitih značenja karaktera, TeH će ih podeliti u kategorije kodova , ili ketkodove za kratko. Postoji 16 kategorija kodova u TeHu.

Snažna karakteristika TeHa je njegova sposobnost da redefiniše svoj jezik, jer postoji \catcode funkcija koja će vam omogućiti da promenite kategorijski kod bilo kog znaka.

Međutim, to se ne preporučuje, jer može učiniti da se kod teško čita. Ukoliko redefinišete bilo koji ketkod u klasi ili u stil datoteci, uverite se da je vratiti na kraju fajla.

Ako redefinišete ketkodove u dokumentu, uverite se da to uradite posle preambule da sprečite sukobe sa učitavanjem paketa.

Kod Opis Uobičajeni kod
0 Izlazak karaktera i kontrolne sekvence \
1 Početak grupe {
2 Kraj grupe }
3 Matematička smena $
4 Kartica poravnanja &
5 Kraj linije ^^M (ASCII vrati)
6 Makro parametar #
7 Eksponent ^ i ^^K
8 Potpisan znak _ i ^^A
9 Ignorisan karakter ^^@ (ASCII nula)
10 Razmak i ^^I (ASCII horizontalni tab)
11 Slovo A...Z i a...z
12 Drugi karakteri sve što nije navedeno u drugim ketkodovima. Najčešće, @.
13 Aktivni karakter ~ i ^^L (ASCII oblik izvora)
14 Komentar karakter %
15 Nevažeći karakter ^^? (ASCII brisanje)

Aktivni znakovi[uredi]

Aktivni znakovi liče na makroe: oni su samohrani karakteri koji će se proširiti pre bilo koje druge komande.

\catcode`| = 13
\def|{\TeX}
...
Ово је глуп пример |.

Ovo je glup primer TeHa.

Imajte na umu da aktivni karakter treba da bude direktno sleđen od strane definicije, u suprotnom kompilacija neće uspeti.

Primeri[uredi]

Tehinfo

Tehinfo koristi sintaksu sličnu TeH-u sa jednom glavnom razlikom: sve funkcije se uvode sa @ umesto sa \. Ovo nije slučajno: zapravo koristi TeH za štampanje PDF verzije datoteke. Šta u osnovi radi je unos texinfo.tex koji redefiniše karakter kontrolne sekvence. Moguća implementacija:

\catcode`\@=0
@def@@{@char64} % За писање '@' знака.
\catcode`\\=13 @def\{{@tt @char92}}

@ТеХ команда је претходно написана  'еХ'. Сада је написана као '@@ТеХ'.

TeH komanda je prethodno napisana kao '\TeH'. Sada je napisana kao '@TeH'.

Ovim redefinisanjem, '@' bi trebalo da uvede svaku komandu, dok '\' will zapravo štampa obrnutu kosu crtu karaktera.

Nabrojavanje

Nekima se može učiniti LaTeH sintaksa liste okruženja malo glomaznom. Ovde je brz način da se definiše viki nalik nabrojavanje:


\catcode`| = 13
\def|{\item {--}}
\def\itemize#1{{\leftskip = 40 pt #1 \par}}

\itemize{
| Прва ставка
| Друга ставка
}
Dolar i matematika

Ako imate mnogo dolar simbola za štampanje, možda bolje da promenite matematički znak za promenu.

\catcode`$ = 11
\catcode`| = 3

It costs $100.
Хајде да радимо математику: |50+50=100|. Хајде да ово истакнемо:
||50+50=100||

\makeatletter i \makeatother[uredi]

Ako ste uradili malo LaTeH hakovanja, mora da ste se susreli sa ove dve komande, \makeatletter i \makeatother.

U TeHu '@' znakovi pripadaju ketkod 11 slovima podazumevano. To znači da možete da ga koristite za makro imena. LaTeHu čini upotrebu ketkoda tako da navedete pravilo: sve ne za javnost, unutrašnje makroe kojima ne bi trebalo da pristupe krajnji korisnici koji sadrže najmanje jedan '@' znak u svom imenu. U dokumentu, LaTeH menja ketkod od '@'do 12, drugih.

Zato, kada vam je potreban pristup LaTeH unutrašnjosti, morate priložiti sve komande pristupajući privatnim funkcijama sa \makeatletter i \makeatother. Sve što one rade je samo menjaju ketkod:

\def\makeatletter{\catcode`@ = 11}
\def\makeatother{\catcode`@ = 12}

Makroi Običnog TeH-a[uredi]

\newcommand i \renewcommand su specifične kontrolne sekvence LaTeHa. Oni proveravaju da nijedna od postojećih komandi ne bude u senci nove definicije

U Običnom TeH-u, primitive za makro definiciju ne proveravaju moguće senčenje. To je do vas da se uverite da se ne razbije ništa.

Sintaksa je

\def<macroname>#1<sep1>#2<sep2>{макро садржај, коришћење аргумената #1, бла, #2 ...}

Možete koristiti (skoro) sve sekvence karaktera između argumenata. Na primer hajde da napišemo jednostavni makro koji će pretvoriti decimalni separator od tačke do zareza. Prvi pokušaj:

\def\pointtocomma #1.#2{(#1,#2)}
%%...

\pointtocomma 123.456

Ovo će štampati (123,4)56. Dodali smo zagrade samo da bismo istakli problem. Svaki parametar je najkraći mogući ulaz sekvence koja odgovara makro definiciji, uključujući i separatore. Tako #1 odgovara svim karakterima do prve tačke, i#2 odgovara jedino prvom žetonu, tj je prvi karakter, jer nema separatora nakon toga.

Rešenje: Dodati drugi separator. Razmak može delovati ubedljivo:

\def\pointtocomma #1.#2 {(#1,#2)}

Po pravilu, svaki put kada očekujete nekoliko parametara sa posebnim separatorima, smislite poslednji separator. Ako ne želite da se igrate sa separatorima, onda se makroi Običnog TeH-a koriste kao LaTeH makroi (bez podrazumevanog parametra):

\def\mymacro#1#2#3{{\bf #1}#2{\bf #3}}
%% ...
\mymacro{реч1}{реч2 реч3}{!!!}

Proširene definicije[uredi]

TeH ima još jednu komandu definicije: \edef, koja važi za expanded def. Sintaksa ostaje ista:

\edef<macroname><argumentslist>{<проширени садржај>}

Sadržaj biva proširen (ali ne i izvršen, tj štampan) na mestu gde je \edef korišćen, umesto gde je korišćen definisan makro. Makro ekspanzija nije uvek očigledna ...

Primer:

\def\intro{Пример}
\edef\example#1{\intro~---~#1}
\def\intro{Вежба}

\example{Ово је пример}

Ovde redefinisanje \intro neće uticati na \example.

Globalne definicije[uredi]

Definicije su ograničene svojim opsegom. Međutim, bilo bi zgodno ponekad da se definiše makro unutar grupe koja ostaje na snazi izvan grupe, a do kraja dokumenta. To je ono što mi zovemo globalna definicija .

{
\def\LocalTeX{Локално\TeX}
\global\def\GlobalTeX{Глобално\TeX}
}
Још увек можемо приступити \GlobalTeX{} макроу овде.

Takođe možete koristiti i \global komandu sa \edef.

Obe komande imaju skraćenicu:

  • \gdef za \global\def
  • \xdef za \global\edef

Duge definicije[uredi]

Komande prethodne definicije neće dozvoliti da ih koristite tokom više stavova, tj tekst sadrži \par komandu -- ili dvostruki prelom reda.

Možete ubaciti ispred definicije \long komandu da biste dozvolili više argumenata.

Primer:

\long\def\dummy#1{#1}
\dummy{Први параграф\par Други параграф}

Spoljašnje definicije[uredi]

Ovaj makro prefiks sprečava definicije iz koje se koriste u nekom kontekstu. To je korisno da se konsoliduju makroi i čini ih manje sklonim greškama zbog loših konteksta. Spoljašnji makroi su namenjeni da se koriste van bilo kog konteksta, otuda njihovo ime.

Na primer sledeći kod neće raditi:

\outer\def\test{тест}
\def\failure{\test}

Spoljšnji makroi se ne smeju pojaviti u:

  • makro parametri
  • preskočeni uslov
  • ...

let i futurelet[uredi]

\let<csname><token> je isti kao \expandafter\def\expandafter<csname>\expandafter{<content>}. Definiše ime nove kontrolne sekvence koja je ekvivalentna navedenoj token. token je obično druga kontrolna sekvenca.

Primetimo da će \let proširiti token samo jednom, nasuprot \edef koja će rekursivnoširiti dok je to moguće.

Primer[1]:

Коришћење let:\par
\def\txt{a}
\def\foo{\txt}
\let\bar\foo
\bar % Штампа а
\def\txt{b}
\bar % Штампа б

Коришћење edef:\par
\def\txt{a}
\def\foo{\txt}
\edef\bar{\foo}
\bar % Штампа а
\def\txt{b}
\bar % Штампа а

\futurelet<csname><token1><token2>... radi malo drugačije. token2 je dodeljen csname; nakon toga TeH procesira <token1><token2>... sekvencu. Tako vam \futurelet omogućava da dodelite znak dok ga koristite odmah posle.

Ime specijalne kontrolne sekvence[uredi]

Neki makroi mogu imati ime koje nije moguće napisati kakav jeste. Ovo je slučaj makroa čije ime se sastoji od makro imena.

Primer:

\def\status{пуно}
\def\varempty{Ово је празно}
\def\varfull{Ово је пуно}

\csname var\status \endcsname

Poslednja linija će štampati rečenicu u zavisnosti od \status.

Komanda zapravo radi suprotno od \string koji štampa ime kontrolne sekvence bez proširivanja:

{\tt \string\TeX}

\TeX

Kontrolna ekspanzija[uredi]

\expandafter{token1}{token2} će proširiti token2 pre token1. To je nekad potrebno kada proširenje token2 željeno, ali nije moguće zbog token1.

{\tt \expandafter\string\csname ТеХ\endcsname}

\TeH

\noexpand korisno je imati malo kontrole nad onim što se proširilo u \edef. Primer:

\def\intro{Пример}
\def\separator{~---~}
\edef\example#1{\intro\noexpand\separator#1} 

\example{непроширивање чини сепаратор динамичним у {\tt \string\edef}.}

\def\intro{На пример}
\def\separator{~:~}

\example{сепаратор се променио, али није прва реч.}


\the kontrola sekvence će vam omogućiti da vidite sadržaj raznih vrsta TeHa:

  • ketkodovi
  • čardef
  • parametri fonta
  • unutrašnji parametri
  • dužine
  • registri
  • ...

Primer:

Димензије текста: $ \the\hsize \times \the\vsize $

Registri[uredi]

Registri su vrsta otkucanih variabli. Oni u ograničeni brjevima, od 0 do 255. Postoji 6 različitih vrsta:

Vrsta Opis
kutija jedna kutija
račun celi brojevi
dimen dužina
muskip glu (u mu jedinici)
skip glu
toks niz tokena

TeH koristi neke registre interno, tako da bi bilo bolje da ih ne koristite.

Lista rezervisanih registrara:

  • \box255 se koristi za sadržaj stranice
  • \count0-\count9 se koriste za numerisanje stranica

Streč registar (besplatni):

  • \box0-\box254
  • \count255
  • \dimen0-\dimen9
  • \muskip0-\muskip9
  • \skip0-\skip9

Dodeljeni registar korišćenjem '=' kontrolnog karatkera.Za kutije registre, koristi se \setbox komanda.

\count255=17
\setbox\mybox=\hbox{бла}

Možete koristiti jedan od sledećih rezervisanih makroa da sprečite sukob:

\newbox
\newcount
\newdimen
\newmuskip
\newskip
\newtoks

Ovi makroi koriste sledeću sintaksu: \new*<csname>. Primer:

\newbox\mybox
\setbox\mybox=\hbox{бла}

Ove komande se ne mogu koristiti unutar makroa, inače svaki poziv makroa će rezervisati drugi registar.

Možete štampati registar koristeći \the komandu. Za račun koristite \number komandu. Za kutije koristite \box komandu.

\the\hsize
\number\count255
\box\mybox

Aritmetika[uredi]

Aritmetičke mogućnosti TeHa su veoma ograničene, mada ova baza može dovoljno da se proširi do nekih zanimljivih funkcija. Tri glavne funkcije:

\advance <регистар> <број>
\multiply <регистар> <број>
\divide <регистар> <број>

register može biti tip račun, dimen, muskip ili skip. Ali nema smisla za kutiju ili toks.

Uslovi[uredi]

Osnovna sintaksa je:

\if* <тест><тачна акција>\fi
\if* <тест><тачна акција>\else<нетачна акција>\fi

gde je \if* jedna naredba od sledećih.

Kontrolna sekvenca Opis
\if <a><b> Tačno ako su dva karaktera koda jednaka.
\ifcat <a><b> Tačno ako su dve kategorija koda jednake.
\ifdim <a><rel><b> Dimenzija veze, bilo <, > ili =.
\ifeof Tačno ako je kraj fajla ili ne postoji fajl.
\iffalse Uvek netačno.
\ifhbox <reg> Tačno ako registar kutija sadrži horizontalnu kutiju.
\ifhmode Tačno u horizontalnom režimu.
\ifinner Tačno u unutrašnjem režimu.
\ifmmode Tačno ako je u matematičkom režimu.
\ifnum <a><rel><b> Broj veze, bilo <, > ili =.
\ifodd <num> Tačno ako je broj neparan.
\iftrue Uvek tačno.
\ifvbox <reg> Tačno ako registar kutija sadrži vertikalnu kutiju.
\ifvmode Tačno u vertikalnom režimu.
\ifvoid <reg> Tačno ako je registar kutija prazan.
\ifx <a><b> Tačno ako se dva makroa šire u jedan isti, ili ako su dva koda jednaka, ili ako su dve kategorije kodova jednake.

Primer:

\ifnum 5>6
Ово је тачно
\else
Ово је нетачно
\fi

Ovo je netačno


Samodefinisani uslovi[uredi]

Možete stvoriti nove uslove (kao vrsta bulean varijabli) pomoću \newif komande. Pomoću ovog samodefinisanja uslova, možete kontrolisate izlaz vašeg koda na elegantan način. Najbolji načn ilustracije korišćenja uslova je smisliti primer.

Dve verzije dokumenta moraju biti generisane. Jedna verzija za grupu A, druga za ostatak ljudi (tj. one koji ne pripadaju grupi A): 1. Koristimo \newif da definišemo naš uslov (tj. bulean varijablu).

\newif\ifgroupA

2. Na sledeći način dodeljujemo vrednost (tačno ili netačno) za naš uslov

\groupAtrue % or
\groupAfalse

to je:

\<conditionalsname>true
\<conditionalsname>false

u zavisnosti od toga koju vrednost želimo da postavimo u naš uslov.

3. Sada možemo da koristimo uslov bilo gde nakon u ako kontrolna stuktura.

\ifgroupA
  % Овде пишемо код документа који је
  % намењен за групу А
\else
  % Овде пишемо код документа који је
  %  намењен за остале људе
\fi

Ceo primer je:

\newif\ifdirector 

% Постављамо да је услов нетачан
\directorfalse

\ifdirector
Пишемо нешто за директоријум.
\else
Пишемо нешто за људе.
\fi

Pišemo nešto za ljude

Izjava slučaja[uredi]

Sintaksa je \ifcase <number><case0>\or<case1>\or...\else<defaultcase>\fi. Ako je number jednak broju slučaja, njegov sadržaj će biti štampan. Primetimo da počinje od 0.

\ifcase 2 a\or b\or c\or d\else e\fi

c

\else se koristi da odredi podrazumevani slučaj (kadgod se nijedan od prethodnih slučajeva nije poklopio).

Petlje[uredi]

Osnovna sintaksa je

\loop <садржај> \if*<услов><тачна акција>\repeat

Kao uvek, content i true action su proizvoljni TeH sadržaji. \if* se odnosi na bilo koji od uslovi. Primetimo da nema false action, ne možete staviti \else između \if* i \repeat. U nekim slučajevima ovo će biti suprotno od onoga što želite; morate da promenite uslov ili da definišete nosi uslov koristeći \newif. Primer:

\count255 = 1
\loop
  еХ
\ifnum\count255 < 10
\advance\count255 by 1
\repeat

Ovaj kod će štampati TeH 10 puta.

Ne radeći ništa[uredi]

Nekad može biti koristno reći TeHu da želite da ne radi ništa. Postove dve komande za to: \relax i \empty.

Klasičan primer:

\def\myspace{\hskip 25pt\relax}
\myspace{} plus 10pt

\relax sprečava neželjeno ponašanje ako je plus ili minus iza komande.

Razlika između \empty i \relax leži u ekspanziji: \empty nestaje nakon makro ekspanzije.

TeH karakteri[uredi]

čar[uredi]

Možemo štampati sve znakove koristeći \char {charcode} komandu. Čarkod je zapravo bajt vrednost. Na primer

\char65 = \char `A = \char `\A

Većina znakova odgovara ASCII vrednosti (npr. A-Ša-Š), neki menjaju znakove koji ne mogu da se štampaju iz ASCII.

chardef and mathchardef[uredi]

Možete definisati kontrolnu sekvencu da proširite određeni čar.Sintaksa je \chardef<control sequence>=<charcode>. Sledeće sekvence rade istu stvar.

\chardef\myA=65
\chardef\myA=`A
\chardef\myA=`\A

Primer:

\mathchardef\alphachar = "010B
$\alphachar$

Mapa font kodiranja[uredi]

Možemo koristiti gornji kod da odštampamo mapu fonta kodiranja.

\count255 = 0
\loop
  [\number\count255 =\char\number\count255]
\ifnum\count255 < 127
\advance\count255 by 1
\repeat

Druga verzija, sa različitim fontovima, jedan unos po liniji:

\count255 = 0
\loop
  [\number\count255 =
    \char\number\count255 \ 
    {\tt \char\number\count255}
    {\it \char\number\count255}
  ]
  \hfil\break
\ifnum\count255 < 127
\advance\count255 by 1
\repeat

Verbatim linije i razmaci[uredi]

Prilično je zbunjujuće otkriti kako (La)TeH tretira sve praznina kao isti tip razmaka glua. Običan TeH daje neke komande da se sačuva razmak i nove linije kao kada napišete:

\begingroup
\obeylines
\obeyspaces
Релевантни текст овде
\endgroup

što znači da ćete verovatno morati da kombinete svoje okruženje i svoju komandu:

\newenvironment{мојеокружење}{\begingroup \obeylines \obeyspaces}{\endgroup}
\newcommand{\mycommand}[n]{уради нешто са #1 .. #n}

a onda u svom teh fajlu:

\begin{мојеокружење}
\mycommand{
који год текст да је важно је 
да сачувате размаке и нове линије
јер, као када желите да генерира
вербатим блок касније.
}
\end{мојеокружење}

Makroi definišu makroe[uredi]

Ovo je korisno u nekim slučajevima, na primer za defnisanje komandi jezika kao što je objašnjeno na Multilingual versions, gde krajnji korisnik može da napiše

\en{неки енглески текст}
\de{неки немачки текст}

i da bude siguran da je zamenjn u odgovarajući babel jezik.

Hajde da definišemo makroe koji će definisati komandu jezike na primer. Ove komande su jednostavne: ako je argument u vrednosti \locale varijable, onda odgovarajući makro štampa njegov sadržaj direktno. U suprotnom, ne radi ništa.

U suštini, ono što mi želimo da uradimo je krajnje jednostavno: definisanje gomile makroa ovako:

\newcommand{\de}[1]{#1}
\newcommand{\en}[1]{}
\newcommand{\fr}[1]{}

U prethodnom fragment kodu, samo \de komanda ide ka izlazu svog sadržaja, \en i \fr neće ništa štampati.. To je ono što želimo. Problem nastaje kada želite da automatizujete zadatak, ili ako imate puno jezika, a želite da promenite izbor jezika. Potrebno je samo da premestite #1, ali to nije zgodno i čini nemogućim da izaberete babel jezik iz komandne linije. Razmislite o ovome ...

Ono što ćemo da uradimo je da definišemo komandu jezika sledeći vrednost \locale varijable (ili neke varijable po vašem izboru). Otuda upotreba \equal komande iz ifthen paketa.

Pošto je skoro nemoguće napisati to u LaTeHu, koristićemo Običan TeH.

\def\locale{de}

\def\localedef#1{
  \ifthenelse{ \equal{\locale}{#1} }{
    %% Поставља бабел језик.
    %% Дефинише команду за штампање садржаја.
  }{
    %% Дефинише команду да не штампа ништа.
  }
}

Pojavljuje se drugi problem: kako definisati komandu čije je ime varijabla? U mnogim programskim jezicima to nije moguće. Ono što bismo bili u iskušenju da napišemo je:

\def\#1 #1{#1}

Ovo neće raditi iz dva razloga.

  1. Dva poslednja '#1' treba da se odnose na argumente novog makroa, ali oni bivaju prošireni do \localedef makroa prvog argumenta jer su u telu tog makroa.
  2. \#1 biva proširen na dva tokena: '#' i '1', a \def komanda neće raditi jer zahteva validno ime kontrolne sekvence.

Rešenje za problem 1 je jednostavno: koristite '##1', što će proširiti do '#1' kada je makro izvršen.

Za probmel 2, postoji trik. Moguće je reći tex da je određeni token kontrolna sekvenca. To je namena \csname...\endcsname Bilo kako bilo

\def\csname#1\endcsname ##1{##1}

neće raditi jer će redefinisati \csname u '#1', što mi ne želimo, onda će tex sresti \endcsname, što će biti greška.

Moramo odložiti ekspanziju \def, tj. da kažemo tex da proširi \csname prvo, a onda da primeni \def na to. Postoji komanda za to: \expandafter{token1}{token2}. To će proširiti {token2} pre {token1}.

Konačno, ako želimo da postavimo jezik iz komandne linije, moramo biti u mogućnosti da postavimo \locale varijablu tako da je ona u izvornom kodu podrazumevane vrednosti koja se može prevatići onom u komandnoj liniji. Ovo se može izvršiti pomoću \provdecommand:

\providecommand\locale{fr}

Konačan kod je

%% Required package.
\usepackage{ifthen}
 
%% ТеХ функција која генерише команду језика.
\def\localedef#1#2{
  \ifthenelse{ \equal{\locale}{#1} }{
    \selectlanguage{#2}
    \expandafter\def\csname#1\endcsname ##1{##1}
  }{
    \expandafter\def\csname#1\endcsname ##1{}
  }
}
 
%% Одабрани језик. Може бити постављен било где пре команде језика.
\providecommand\locale{fr}
 
%% Команде језика.
\localedef{de}{немачки}
\localedef{en}{енглески}
\localedef{fr}{француски}
%% ...

I vi možete sastaviti sa

latex '\providecommand\locale{en}\input{mydocument.tex}'

Beleške i reference[uredi]

  1. From tex.stackexchange.com: What is the difference between \let and \edef?
Dodatna literatura


Prethodno: Makroi Indeks Sledeće: Kreiranje paketa